Kurzusok
/
Python
Python
/
Tanterv
/
Listametódusok
Li

Listametódusok ebben a kurzusban: Python

70 feladat

A(z) Listametódusok fogalomról

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.

Elemek hozzáadása

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]

Elemek eltávolítása

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

Megfordítás és átrendezés

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.

Note

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ásai egy listában

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

Elemek indexének megkeresése

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

Másolatok készítése

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.

Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg

Tanuld meg a(z) Listametódusok fogalmat

A gyakorlás zárolva

Oldj fel még 6 feladatot, hogy gyakorolhasd a(z) Listametódusok fogalmat