Hirdetés

Új hozzászólás Aktív témák

  • cousin333
    addikt

    Na, akkor kissé pörgessük meg a topikok...

    Szóval, lenne egy feladatom. Adott egy szöveges fájl az alábbi felépítéssel:

    a b c d
    1 2 3 4
    5 6 7 8
    9 8 7 6
    5 4 3 2

    Tehát van egy x hosszúságú fejléc, és alatta soronként azonos számú szám. A fejléc az első sor, a számsorokból száma tízezres nagyságrendű (egy sorban kb. 10 elem található, de ez az érték - elvileg - minden sornál fix). A sorok elemei között tabulátor karakter található.

    A feladat egy olyan csv fájl létrehozása lenne, ami az említett fejléccel kezdődik, megadott számú sort átlagol és kiírja az eredményt az új fájl egyetlen sorába. Tehát, a fenti példánál maradva a kiírt fájl ez lenne (ha a megadott sorszám mondjuk 2):

    a b c d
    3 4 5 6
    7 6 5 4

    Mert a 3 az az eredeti fájl első két sora első elemeinek az átlaga: (1+5)/2, a 4 az a másodiké: (2+6)/2 és így tovább, remélem érthető. Ha a számsorok száma nem egésszámú többszöröse az átlagolás számának, akkor a kimaradó elemek nyugodtan elhagyhatóak. A programnak nem kell hülyebiztosnak lennie, tehát nem kellenek bele mindenféle extra ellenőrzések, kivételkezelések, meg ilyesmik.

    A programnak a feldolgozandó fájl nevét, és az osztások számát (hogy hány soronként átlagoljon) kellene bekérnie a futás során. A kimeneti fájl neve nyugodtan lehet a bemeneti fájl módosított verziója.

    A cél az lenne, hogy egy minél egyszerűbb, minél hatékonyabb és minél "Pythonosabb" kód szülessen.

    +1 feladat: Képes legyen felismerni, ha egy számsor esetleg a kelleténél kevesebb elemből áll, és kijelezze a sor számát, ahol ez először előfordul.

    Ennyire ne tépjétek magatokat... :D

    Amúgy alant látható a saját megoldásom, hátha az meghozza a vitakedvet...

    fileName, cnt = input('Fajl neve? '), int(input('Oszto? '))

    with open('d:\\' + fileName + '.txt', 'r') as iF:
    allData = [line.strip('\n').split('\t')[1:] for line in iF]
    header, datas = allData[0], [[float(x) for x in elem] for elem in allData[1:]]

    with open('d:\\' + fileName + '_avg.csv', 'w') as oF:
    oF.write(';'.join(header)+'\n')

    for x in range(len(datas)//cnt):
    s = datas[x*cnt:(x+1)*cnt]
    oF.write(';'.join([str(round(sum([elem[i] for elem in s])/len(s))) for i in range(len(header))])+'\n')

Új hozzászólás Aktív témák