Lista vagy szótár?

A két adatszerkezetnek vannak közös vonásai – mikor melyiket használjuk?

Megkerülhetetlen különbség, hogy a lista mutabilis, a vektor immutabilis: ebből az következik, hogy ha az elemek változhatnak, akkor a lista jobb választás lehet.

De mi a helyzet akkor, ha az elemek nem változnak? A python dokumentációja szerint a lista jellemző módon egynemű elemeket tartalmaz, amelyeket iterálással érünk el, ezzel szemben a vektor általában különböző jellegű elemekből áll, amelyekhez indexeléssel vagy többszörös értékadás valamelyik oldalával férünk hozzá.

Utóbbira példa lehet a Foci című feladat (inf_e_20071106_m_04): itt a bemeneti állomány sorai egymás mellett tartalmazzák a forduló sorszámát, a mérkőzés végi, illetve félidei állást, valamint a két csapat nevét – ezek az adatok eléggé különbözőek ahhoz, hogy ez önmagában indokolja a vektor választását.

Az első sor eldobása után a továbbiakból egyetlen programsorral listát építünk, majd a következőben e lista elemeit vektorrá alakítjuk. Túl azon, hogy a stringként beolvasott értékeket számmá konvertáljuk, az elemeket is ésszerűbbnek tűnő módon rendezzük át: a forduló sorszámát a két csapat neve, majd elsőként a félidei, végül a mérkőzés végi eredmény követi:

_(1)

print('A meccs.txt állomány adatainak olvasása…')
file= open('inf_e_20071106_m_04_meccs.txt')
dmmy= file.readline()
l_l= [line.split() for line in file]
l_t= [(int(l[0]), l[5], l[6], int(l[3]), int(l[4]), int(l[1]), int(l[2])) for l in l_l]

Összehasonlításképpen a két lista kezdő elemei:

>>> l_l[0]
['14', '1', '2', '0', '2', 'Agarak', 'Ovatosak']
>>> l_t[0]
(14, 'Agarak', 'Ovatosak', 0, 2, 1, 2)

A következő lépésben a stringek formázott kiírását érdemes megfigyelni. A (feladat szempontjából túl nagy jelentőséggel nem bíró) %1d részlet jelentése: egyetlen karakter szélességben akarjuk megjeleníteni az egészeket.

_(2)

n= int(input('Kérem egy forduló számát: '))
for t in l_t:
    if t[0]==n:
        print('%s–%s: %1d-%1d (%1d-%1d)' % (t[1], t[2], t[5], t[6], t[3], t[4]))

A 3. lépés egyszerű kiválasztási feladat; csak azt nem szabad szem elől tévesztenünk, hogy egyaránt (és másképp) kezelendő, ha a hazai csapat fordított, illetve ha a vendégcsapat.

A %2d részletnek már van jelentősége: így biztosíthatjuk, hogy (például) az 1., illetve a 10. forduló sorszámai helyiérték-helyesen kerüljenek egymás alá:

_(3)

print('A bajnokság során a következő csapatoknak sikerült megfordítaniuk az állást a második félidőben:')
for t in l_t:
    if   t[3]<t[4] and t[5]>t[6]:
        print('%2d. forduló: %s' %(t[0], t[1]))
    elif t[3]>t[4] and t[5]<t[6]:
        print('%2d. forduló: %s' %(t[0], t[2]))