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]))