Listák listája

Eddig nem esett szó róla, de a lista elemei különböző típusúak is lehetnek. Egyazon lista éppen úgy tartalmazhat logikai értéket, számot vagy stringet, mint ahogyan tartalmazhat például listát vagy vektort is:

>>> row1= [11, 12]
>>> row2= [21, 22]
>>> rows= [row1, row2]
>>> rows
[[11, 12], [21, 22]]
>>> 

A fentihez hasonló lista esetén különösen is figyelnünk kell arra, hogy új elem hozzáfűzésekor megfelelőképpen járjunk el. Korábban láttuk, hogy listához nem fűzhetünk hozzá (magában álló) számot, de listákat tartalmazó listához már hozzáfűzhetünk számokat tartalmazó listát, márpedig többnyire valószínűleg nem ez a cél:

>>> row3= [31, 32]
>>> rowS= rows + row3
>>> rows= rows + [row3]
>>> rowS
[[11, 12], [21, 22], 31, 32]
>>> rows
[[11, 12], [21, 22], [31, 32]]

A fenti példa alapján rögzítsük azt is: a python megkülönbözteti a változónevekben a nagy- és a kisbetűket.

A fenti lista 0 indexű eleme értelemszerűen egy lista, melynek 0 indexű eleme egy szám:

>>> rows[0]
[11, 12]
>>> rows[0][0]
11
>>> 

Efféle összetett lista természetesen létrehozható egyetlen értékadással is:

>>> rows=[[11, 12, 13], [21, 22, 23]]
>>> rows
[[11, 12, 13], [21, 22, 23]]

Az utóbbi lista érdemében, leglényegesebb vonásait tekintve különbözik az azonos nevű korábbitól: az elsőnek három eleme van (és reprezentálhat például egy 3x2-es mátrixot), a másodiknak két eleme van (és például egy 2x3-as mátrixot reprezentálhat – vagy a kettő éppen fordítva, de ezt inkább hagyjuk).

Egyszerű szorzótáblát létrehozva:

>>> ll= [4*[0], 4*[0], 4*[0], 4*[0]]
>>> ll
[[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
>>> for i in range(4):
...     for j in range(4):
...         ll[i][j]= i*j
... 
>>> ll
[[0, 0, 0, 0], [0, 1, 2, 3], [0, 2, 4, 6], [0, 3, 6, 9]]

Az első sor értékadása –ilyen típusú építkezésnél– nélkülözhetetlen: csak akkor adhatunk értéket egy lista i. elemének, ha a listának van i. eleme.

Ismét utalunk a lista és a tartomány 0 alapú számozásának szoros kapcsolatára és nyilvánvaló összhangjára – ebből persze természetesen fakad, hogy a szorzótáblánk is tartalmazza a 0 szorzásának sorát (illetve a 0-val való szorzás oszlopát).

Más típusú értékadásnál nincs szükség a listák listájának előzetes létrehozására (illetve értékekkel való feltöltésére):

>>> ll= 'egészen más típus'
>>> ll= [[i*j for j in range(4)] for i in range(4)]
>>> ll
[[0, 0, 0, 0], [0, 1, 2, 3], [0, 2, 4, 6], [0, 3, 6, 9]]

A fenti példa elsőre megrázó lehet (talán másodikra is az); ha valakit megbotránkoztat, nyugodtan lépjen tovább.