A list egy módosítható gyűjtemény, amely sorrendben tárolja az elemeket.
Ahogy a legtöbb gyűjtemény (lásd a beépített tuple, dict és set típusokat), a listák bármilyen (vagy akár többféle) adattípusra tárolhatnak hivatkozást, beleértve a többi listát is.
A Pythonban sorozatnak számítanak, és egészben vagy részben szeleteléssel másolhatók.
Ahogy bármely sorozatban, a lists elemeire balról 0-based index számmal, jobbról -1-based index számmal is hivatkozhatsz.
A listák támogatják mind a közös, mind a módosítható sorozatműveleteket, például a min(<list>)/max(<list>), <list>.index(), <list>.append() és <list>.reverse() metódusokat.
Az elemeken a for item in <list> szerkezettel iterálhatsz, illetve a for index, item in enumerate(<list>) szerkezettel, amikor az elemre és az elem indexére is szükséged van.
A Python sok hasznos metódust kínál a listákkal való munkához.
Mivel a listák módosíthatók, a lista-metódusok megváltoztatják a metódusnak átadott eredeti listaobjektumot.
Ha nem szeretnéd módosítani az eredetit, akkor az eredeti list-ről slice vagy <list>.copy() segítségével kell shallow copy-t (legalábbis) készítened.
Elemeket a meglévő lista végéhez a <list>.append(<item>) metódussal adhatsz hozzá:
>>> numbers = [1, 2, 3]
>>> numbers.append(9)
>>> numbers
[1, 2, 3, 9]
Ahelyett, hogy a végére fűzné, a <list>.insert(<index>, <item>) a lista egy adott indexére szúrja be az elemet.
Az <index> annak az elemnek az indexe, amely elé az új elemet szeretnéd beszúrni.
Az <item> a beszúrandó elem.
Megjegyzés: Ha az <index> értéke 0, az elem a lista elejére kerül.
Ha az <index> nagyobb, mint a lista utolsó indexe, az elem az utolsó helyre kerül, ami megegyezik a <list>.append(<item>) használatával.
>>> numbers = [1, 2, 3]
>>> numbers.insert(0, -2)
>>> numbers
[-2, 1, 2, 3]
>>> numbers.insert(1, 0)
>>> numbers
[-2, 0, 1, 2, 3]
Egy iterable a <list>.extend(<iterable>) metódussal fűzhető össze egy meglévő listával (a kettőt összefűzve).
A <list>.extend(<iterable>) kicsomagolja a megadott iterábilist, és elemeit ugyanabban a sorrendben hozzáfűzi a cél lista végéhez.
Ha ilyenkor a <list>.append(<item>) metódust használnád, az a teljes iterábilist egyetlen elemként adná hozzá.
>>> numbers = [1, 2, 3]
>>> other_numbers = [5, 6, 7]
>>> numbers.extend(other_numbers)
>>> numbers
[1, 2, 3, 5, 6, 7]
>>> numbers.extend([8, 9])
>>> numbers
[1, 2, 3, 5, 6, 7, 8, 9]
A <list>.remove(<item>) metódussal eltávolíthatsz egy elemet a listából.
A <list>.remove(<item>) ValueError kivételt dob, ha az elem nem szerepel a listában.
>>> numbers = [1, 2, 3]
>>> numbers.remove(2)
>>> numbers
[1, 3]
# Trying to remove a value that is not in the list throws a ValueError.
>>> numbers.remove(0)
ValueError: list.remove(x): x not in list
Vagy használhatod a <list>.pop(<index>) metódust, amely eltávolít egy elemet, és a return segítségével vissza is adja azt további felhasználásra.
A <list>.pop(<index>) egyetlen opcionális paramétert fogad: az eltávolítandó és visszaadandó elem indexét.
Ha nem adod meg az opcionális <index> argumentumot, a lista utolsó eleme törlődik és kerül visszaadásra.
Ha az <index> nagyobb, mint a lista utolsó indexe, IndexError kivétel keletkezik.
>>> numbers = [1, 2, 3]
>>> numbers.pop(0)
1
>>> numbers
[2, 3]
>>> numbers.pop()
3
>>> numbers
[2]
# This will throw an error because there is only index 0.
>>> numbers.pop(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: pop index out of range
Egy list összes eleme eltávolítható a <list>.clear() metódussal. Ez nem fogad paramétert.
>>> numbers = [1, 2, 3]
>>> numbers.clear()
>>> numbers
[]
A listaelemek sorrendje helyben megfordítható a <list>.reverse() metódussal. Ez módosítja az eredeti listát.
>>> numbers = [1, 2, 3]
>>> numbers.reverse()
>>> numbers
[3, 2, 1]
Egy lista helyben átrendezhető a <list>.sort() segítségével.
Az alapértelmezett rendezési sorrend balról növekvő.
A Python dokumentációja további tippeket és technikákat kínál a rendezéshez.
2002 és 2022 között a Python belsőleg egy Timsort nevű algoritmust használt a listák elrendezésére, de a Python 3.11-től kezdve Powersortra váltott.
A változással kapcsolatos részleteket és a Python-csapat vitáját a GitHub 78742-es issue oldalán olvashatod.
Az algoritmus technikai részleteiről lásd J. Ian Munro és Sebastian Wild Nearly-Optimal Mergesorts: Fast, Practical Sorting Methods That Optimally Adapt to Existing Runs című dolgozatát.
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
# The default sort order is *ascending*.
>>> names.sort()
>>> names
["Bruce", "Natasha", "Thor", "Tony"]
Ha egy listát csökkenő sorrendbe szeretnél rendezni, add át a metódusnak a reverse=True argumentumot:
>>> names = ["Tony", "Natasha", "Thor", "Bruce"]
>>> names.sort(reverse=True)
>>> names
["Tony", "Thor", "Natasha", "Bruce"]
Ha nem szeretnéd módosítani az eredeti list-et, használhatod a beépített sorted() és reversed() függvényt.
A sorted(<list>) egy rendezett másolatot ad vissza, és ugyanazokat a paramétereket fogadja, mint a <list>.sort().
A reversed(<list>) egy iterátort ad vissza, amely a lista elemeit fordított sorrendben szolgáltatja.
Az Iterators fogalmát egy másik feladatban tárgyaljuk részletesen.
Egy elem előfordulásainak számát a <list>.count(<item>) segítségével derítheted ki.
Visszaadja, hogy az <item> összesen hányszor szerepel elemként a listában.
>>> items = [1, 4, 7, 8, 2, 9, 2, 1, 1, 0, 4, 3]
>>> items.count(1)
3
A <list>.index(<item>) a megadott elem első előfordulásának indexszámát adja vissza.
Ha nincs előfordulás, ValueError kivétel keletkezik.
Az indexelés balról 0-based, ami azt jelenti, hogy az első elem pozíciója a 0 index.
A jobbról történő indexelés is támogatott, -1 indexszel kezdve.
>>> items = [7, 4, 1, 0, 2, 5]
>>> items.index(4)
1
>>> items.index(10)
ValueError: 10 is not in list
A start és end indexek megadásával a lista egy adott szakaszán belül kereshetsz:
>>> names = ["Tina", "Leo", "Thomas", "Tina", "Emily", "Justin"]
>>> names.index("Tina")
0
>>> names.index("Tina", 2, 5)
3
Ha nincs szükséged egy elem pontos helyére, a beépített in operátor hatékonyabb a tagság ellenőrzésére.
>>> names = ["Tina", "Leo", "Thomas", "Tina", "Emily", "Justin"]
>>> "Thomas" in names
True
Ne feledd, hogy a Pythonban a változók olyan nevek, amelyek mögöttes objektumokra mutatnak.
A nevek egy program élettartama alatt különböző objektumokhoz köthetők, illetve újraköthetők.
Ha egy list objektumot egy új változó névnek adsz értékül, az nem másolja le az objektumot vagy a rá hivatkozó adatokat.
Az új és a régi név ugyanarra a list objektumra fog mutatni.
Ráadásul a listák konténer típusú objektumok: a helytakarékosság érdekében a konténerek csak hivatkozásokat tárolnak a bennük lévő elemekre, magukat az elemeket nem.
Ez az „optimalizálás” váratlan következményekkel járhat a gyanútlanok számára.
A <list>.copy() egy új list objektumot hoz létre, de nem hoz létre új objektumokat a hivatkozott elemek számára: a másolat „sekély”.
Egy shallow copy általában elegendő, ha az egyik list objektumból szeretnél elemeket hozzáadni vagy eltávolítani anélkül, hogy a másikat módosítanád.
Ha viszont bármilyen esély van rá, hogy egy list mögöttes elemei véletlenül módosulnak (ezzel az összes kapcsolódó sekély másolatot is módosítva), akkor a copy modul copy.deepcopy() függvényét kell használni egy teljes, azaz „mély” másolat készítéséhez az összes hivatkozásról és objektumról.
A nevek, értékek, listák és egymásba ágyazott listák viselkedésének részletes magyarázatáért nézd meg Ned Batchelder remek blogbejegyzését: Names and values: making a game board. A Shallow vs Deep Copying of Python Objects szintén jó összefoglalót ad a másolással kapcsolatos szempontokról.