A dimenziók bűvöletében

Ebben a posztban a listáinkat tesszük többdimenzióssá.

Ez egy egydimenziós lista: ['mert', 'olyan', 'mint', 'egy'] vonal, azaz csak egy kiterjedése van, mégpedig a hosszúsága (tudod: len()).

[['Ha', 'egy', 'lista'],
['egy', 'táblázatra', 'hasonlít'],
['akkor', 'kétdimenziósnak', 'hívjuk.']]

Nézd meg jól eszt a listát: hány eleme van? Kilenc?? Nem, csak három, de mindegyik egy újabb lista, megint csak három-három elemmel. Ez egy kétdimenziós lista, amit Pythonban gyakran neveznek listák listájának (angolul: list of lists). Persze nem kell három sorban írni. A kódban szabad, mert esetleg úgy neked olvashatóbb, de ha ki akarod print()-elni, akkor bizony egy sorba kerül, így:
[['Ha', 'egy', 'lista'], ['egy', 'táblázatra', 'hasonlít'], ['akkor', 'kétdimenziósnak', 'hívjuk.']].

Az egyes elemek elérésére ilyenkor két indexet használunk. Ha a fenti lista neve a kreativitás esszenciájaként “lista”, akkor “táblázatra” szó a lista[1][1], azaz a második elem második eleme.

Na, akkor videózzunk:

A split() tagfüggvény

A karakterlánc adattípus tagfüggvénye, és arra jó, hogy az általunk megadott határolókarakternél szétszedi a karakterláncot listává. Ha nem adunk meg semmit, akkor a whitespace karaktereknél (emléxel: szóköz, sorvége, tabulátor) hasít, de különben nézd meg magadnak.

Feladatok

A következő feladatok megoldásánál használd ezt a fájlt (az oszlopok jelentése: név, poszt, játszott meccsek száma, rúgott gólok száma):

Aladar hatved 8 2
Bela hatved 10 2
Csaba csatar 7 10
Dezso csatar 8 11
Elemer kozeppalyas 9 3
Ferenc kozeppalyas 9 3
Geza csatar 9 4

F0029a: Írd ki a csapattagok nevet egy sorba, vesszővel elválasztva! Adj megoldást úgy is, hogy tárolod az adatokat egy 2D listában, meg úgy is, hogy nem tárolod őket, csak olvasol egy sort és már írsz is! (Megoldás itt.)

F0029b: Áruld el, hogy hány csatár adatai vannak tárolva a fájlban! (Megoldás itt.)

F0029c: Az előző megoldásodat alakítsd át úgy, hogy használj függvényt, és a függvény akármelyik poszton játszó játékosokat meg tudja számolni. A függvény két paramétere a 2D lista, illetve a megszámolandó játékosok posztja. (Megoldás itt.)

F0029d: Ki és milyen poszton rúgta a legkevesebb gólt? Tipp: határozd meg, hogy mennyi a legkevesebb gól, aztán határozd meg, hogy ki rúgott ennyit. (Megoldás itt.)

F0029e: Van-e olyan, aki legalább 10 meccset játszott?

F0029f: Hány gólt rúgtak a játékosok átlagosan? Tipp: számold össze a gólokat, majd a kapott számot oszd el a focisták lista hosszával!

F0029g: Hány gólt rúgtak az egyes posztokon lévő játékosok átlagosan?

Előzőleg megtanultunk fájlt olvasni és írni.

Reklámok

A dimenziók bűvöletében” bejegyzéshez ozzászólás

  1. Kedves raerek!

    Először is szeretném elmondani, hogy ez a tananyag sorozat egyszerűen fantasztikus. Annyira könnyed és lényegre törő és sokat mondó.

    Másodszor eddig a pontig (Függvények, szövegfájlok, többdimenziós listák) nagyon jól haladtam tanulásban és megértésben is. Aztán itt jött a probléma, ebben a tömben lévő három anyag kicsit kifogott velem. Értem a lényegét mind a három anyagnak, de nem olyan magabiztosan. Nem értem az egészet, és ez most nagyon zavar. Annyira, hogy most nem tudom a hogyan továbbot. Ezért szeretném kérni a tanácsodat.

    Mit tegyek most? Mit csináljak, hogy megértsem ennek a három leckének minden részletét?

    Addig nem szeretnék továbbhaladni, mert ezek fontos részek.

    Kérlek adj tanácsot.

    Köszönöm szépen előre is.

    Üdvözlettel: Ádám

    Kedvelés

    • Szia Ádám!

      Ha túl vagy az összes feladaton is, akkor szerintem két utad van:
      Vagy tegyél fel konkrét kérdést, és akkor megpróbálok segíteni,
      vagy megnézed a következő leckéket, és ha addigra sem érted, akkor visszatérsz ide.

      Kedvelés

  2. Köszönöm szépen a válaszodat. Lesz több kérdésem is, viszont először beírnám az saját megoldásomat az utolsó feladatról. Ezt azért teszem, mert szerintem nem a legjobb. Működik egyébként, csak az a megérzésem, hogy lehetne sokkal egyszerűbben.

    F0029g: Hány gólt rúgtak az egyes posztokon lévő játékosok átlagosan?

    def atlag_golok_csatar():
    golok = 0
    poszt = 0
    for elem in lista:
    if elem[1] == ‘csatar’:
    golok += int(elem[3])
    poszt += 1
    atlag_gol = golok / poszt
    return atlag_gol

    def atlag_golok_kozeppalyas():
    golok = 0
    poszt = 0
    for elem in lista:
    if elem[1] == ‘kozeppalyas’:
    golok += int(elem[3])
    poszt += 1
    atlag_gol = golok / poszt
    return atlag_gol

    def atlag_golok_hatved():
    golok = 0
    poszt = 0
    for elem in lista:
    if elem[1] == ‘hatved’:
    golok += int(elem[3])
    poszt += 1
    atlag_gol = golok / poszt
    return atlag_gol

    listak = []

    forrasfajl = open(‘Feladat005.txt’, ‘r’)

    for sor in forrasfajl:
    listak.append(sor.strip().split())

    forrasfajl.close()

    print(‘A csatárok átlag gólszáma: ‘, atlag_golok_csatar(), ‘\n’
    ‘A középpályások átlag gólszáma: ‘, atlag_golok_kozeppalyas(), ‘\n’
    ‘A hátvédek átlag gólszáma: ‘, atlag_golok_hatved(), ‘\n’)

    Kedvelés

    • A frappánsság titka az lesz, hogy olyan függvényt írsz, aminek a paramétere a poszt:)
      Frappánsítsd tovább a megoldást, ha odajutsz: ne definiáld a posztok nevű listát, hanem rakd össze a bemeneti fájlban előforduló posztokból. Kérdezz bátran, ahogy odajutok, válaszolok:)

      def mennyitrúgtak(szerep):
      #a paraméter neve szándékosan nem poszt, bár az is lehetne
      #akkor ez egy másik poszt nevű változó volna, nem ugyanaz, mint a lenti
      ennyit = 0
      for focista in focisták:
      if focista[1] == szerep:
      ennyit += int(focista[-1])
      return ennyit

      focisták = []

      forrásfájl = open(‘bemenet.txt’)

      for sor in forrásfájl:
      focisták.append(sor.strip().split())

      forrásfájl.close()

      posztok = [‘hatved’, ‘csatar’, ‘kozeppalyas’]
      for poszt in posztok:
      print(poszt, ‘: ‘, mennyitrúgtak(poszt), sep=”)

      Kedvelés

  3. F0029d: Valahogy máshogy jár az agyam… Végülis működik:)

    focistak = []
    golok = []

    forrásfájl = open(‘foci.txt’)

    for sor in forrásfájl:
    focistak.append(sor.strip().split()[0])
    golok.append(int(sor.strip().split()[3]))

    forrásfájl.close()

    keresett = min(golok)

    print(keresett, ‘a legkevesebb gól, ‘, end = ”)

    print(focistak[golok.index(keresett)], ‘az elkövető.’)

    Kedvelés

    • Teljesen rendben van, ha az ilyen elemi feladatoknál szétszeded az adatokat – később meg, ha nagyobb táblákkal dolgozol, akkor úgyis egyben fogod őket tartani, vagy pedig objektumokat készítünk majd belőlük, hiszen van, ahol az lesz a célravezető.:)

      Kedvelés

  4. Hasonló kérdésem van – azt hiszem – mint az előttem hozzászólónak. Az nem gond, ha szétszedem az adatokat, vagyis csináltam egy újabb listát a b és a c feladatban a csapatrészeknek és abban count tagfüggvénnyel számoltam:

    def csapatreszek(ketdlista, poszt):
    csapatresz_lista =[]
    for sorlista in ketdlista:
    csapatresz_lista.append(sorlista[1])
    return csapatresz_lista.count(poszt)

    Kedvelés

    • Jelen szintünkön nem gond, egyáltalán. Gond olyankor lesz majd, ha nagyon sok adattal dolgozol, hiszen most van egy plusz adatmásolós műveleted, ami végső soron idő és memória.

      Kedvelés

    • Jól csináltál mindent:
      önállóan fedezi fel a posztokat
      megtart minden információt, hátha később mást kell számolni belőle

      Azt lehetne még csinálni, hogy amikor felfedez egy új posztot, akkor végigrohan a fájl maradék részén, mert ugye aleddig tutira nem volt olyan poszt, elég, ha a hátralévőt nézi végig. Kérdés, hogy ez a bonyolítás nem teszi-e túlzottan átláthatatlanná a programot. Biztos megvan az a mennyiségű és jellegű adat, ahol már megéri így csinálni, itt szerintem a te megoldásod a jó.

      Akkor lehetne egyszerűsíteni, ha beledrótoznád a programba a lehetséges posztokat.

      Kedvelik 1 személy

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s