2.7. Listák

A lista értékek változtatható, rendezett sorozata. A karakterláncokkal és a bájtokkal ellentétben a listák bármilyen típusú értéket tárolhatnak, és az elemeket helyben módosíthatod, hozzáadhatod vagy eltávolíthatod.

2.7.1. Listák létrehozása

A szögletes zárójelek listaliterált hoznak létre:

empty   = []
nums    = [1, 2, 3]
mixed   = [1, "two", 3.0, True, None]    # any types
nested  = [[1, 2], [3, 4], [5, 6]]       # lists of lists

A list konstruktor bármilyen iterálható objektumból listát épít:

>>> list("abc")
['a', 'b', 'c']
>>> list(range(5))
[0, 1, 2, 3, 4]

2.7.2. Hossz, indexelés és szeletelés

A len() az elemek számát adja vissza. Az indexelés és a szeletelés ugyanúgy működik, mint a karakterláncoknál – a pozíciók 0-tól indulnak, a negatív indexek a végétől számolnak, és az érvényes tartományon kívüli szelet csendben levágódik, ahelyett, hogy kivételt váltana ki:

>>> nums = [10, 20, 30, 40, 50]
>>> len(nums)
5
>>> nums[0]
10
>>> nums[-1]
50
>>> nums[1:4]
[20, 30, 40]
Hat cellából álló lista, fölöttük a 0..5 pozitív indexekkel, alattuk pedig a -6..-1 negatív indexekkel.

A pozitív indexek elölről számolnak; a negatív indexek a végétől.

A szeletelési szintaxis egy slice objektum rövidített alakja, amelyet a Python a háttérben felépít. A nums[1:4] ugyanaz, mint a nums[slice(1, 4)]. Ritkán hozol létre ilyet kézzel, de a slice() időnként hasznos lehet egy szelet értékként való tárolásához, hogy később újra felhasználhasd:

head = slice(0, 3)
print(nums[head])             # [10, 20, 30]
print(letters[head])          # first three letters, same slice

2.7.3. Lista módosítása

A listák támogatják az indexelt és szeletelt helyben történő értékadást:

>>> nums = [10, 20, 30]
>>> nums[0] = 99
>>> nums
[99, 20, 30]
>>> nums[1:3] = [200, 300, 400]    # slice can change the length
>>> nums
[99, 200, 300, 400]

A leggyakoribb listametódusok:

  • list.append() – egyetlen elem hozzáadása a végéhez.

  • list.extend() – egy iterálható objektum minden elemének hozzáfűzése.

  • list.insert() – beszúrás egy adott pozícióra.

  • list.remove() – egy érték első előfordulásának törlése.

  • list.pop() – egy elem eltávolítása és visszaadása (alapértelmezetten az utolsóé).

  • list.clear() – minden elem eltávolítása.

  • list.sort() – helyben rendezés. Add át a reverse=True paramétert csökkenő sorrendhez.

  • list.reverse() – helyben megfordítás.

>>> nums = []
>>> nums.append(1)
>>> nums.extend([2, 3])
>>> nums.insert(0, 99)
>>> nums
[99, 1, 2, 3]
>>> nums.pop()
3
>>> nums.sort()
>>> nums
[1, 2, 99]

Ezek a metódusok helyben módosítják a listát, és None értéket adnak vissza. A következő írása

nums = nums.sort()    # nums is now None -- common bug

szinte soha nem az, amit szeretnél; az eredeti nums rendeződött, de az értékadás ezután felülírja a nevet a visszatérési értékkel. Vagy hívd meg a nums.sort() metódust külön sorban, vagy használd a beépített sorted() függvényt, hogy egy új, rendezett listát kapj vissza az eredeti módosítása nélkül.

2.7.4. Operátorok

  • A + két listát fűz össze egy új listává.

  • A * megismétel egy listát.

  • Az in tagságot vizsgál.

>>> [1, 2] + [3, 4]
[1, 2, 3, 4]
>>> [0] * 5
[0, 0, 0, 0, 0]
>>> 3 in [1, 2, 3]
True

2.7.5. Iterálás egy listán

Egy for ciklus sorrendben végigjárja az elemeket:

for n in [10, 20, 30]:
    print(n)

2.7.6. Aliasok és módosítás

A lista egyetlen érték a memóriában; több név is mutathat ugyanarra a listára. Az egyik néven keresztüli módosítás minden más, ugyanarra a listára mutató néven keresztül látható.

Az a és b változók is ugyanarra a listaobjektumra mutatnak; az a-hoz való hozzáfűzés a b-n keresztül is látható.

Az a és a b is ugyanarra a listára mutat. Bármelyik néven keresztüli módosítás megváltoztatja azt, amit minden más név lát.

>>> a = [1, 2, 3]
>>> b = a
>>> a.append(4)
>>> b
[1, 2, 3, 4]                # same object, change is visible

Független másolat készítéséhez szeleteld le a teljes listát, vagy hívd meg a list konstruktort:

>>> c = a[:]                # or list(a)
>>> a.append(5)
>>> c
[1, 2, 3, 4]                # c is unaffected

Ez csak a felső szintű listát másolja le; a beágyazott listák továbbra is megosztottak az eredeti és a másolat között.