Funkce Python enumerate() vysvětlená na příkladech

Tento tutoriál vás naučí, jak používat funkci enumerate() v Pythonu.

Funkce enumerate() v Pythonu poskytuje stručnou syntaxi pro přístup k položkám v iterovatelné podobě spolu s jejich indexy.

Začneme tím, že se podíváme na to, jak přistupovat k položkám a indexům pomocí jednoduchého cyklování, a poté se budeme učit syntaxi funkce enumerate() v Pythonu. Po cestě budeme také kódovat příklady.

Pojďme začít.

Jak iterovat pomocí pro smyčku v Pythonu

Jakýkoli objekt Pythonu, který můžete iterovat a přistupovat k jednotlivým položkám – jeden po druhém, se nazývá iterovatelný. Proto jsou všechny seznamy, n-tice, slovníky a řetězce v Pythonu iterovatelné.

Vezměme si příklad nákupního seznamu definovaného v buňce kódu níže.

shopping_list = ["fruits","cookies","cereals","protein bars","post-it notes"]

V Pythonu můžete použít smyčku for k procházení libovolnou iterovatelnou možností. Syntaxe, jak to udělat, je následující:

for item in <iterable>:
    # do something on item

# item: looping variable
# <iterable>: any Python iterable: list, tuple, dictionary, string, and so on.

Nyní pomocí této syntaxe projdeme nákupním_seznamem a zpřístupníme jednotlivé položky.

for item in shopping_list:
  print(item)

# Output
fruits
cookies
cereals
protein bars
post-it notes

Tato konstrukce vám pomůže přistupovat k položkám přímo. Někdy však můžete potřebovat přístup k indexu položek, kromě položek samotných.

Můžete použít proměnnou indexu, kterou můžete zvýšit uvnitř těla smyčky, jak je znázorněno níže:

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  index += 1

# Output
index:0, fruits
index:1, cookies
index:2, cereals
index:3, protein bars
index:4, post-it notes

Ale to není nejúčinnější metoda. Pokud si nezapomenete zvýšit index, váš kód nebude fungovat podle očekávání.

index = 0
for item in shopping_list:
  print(f"index:{index}, {item}")
  # no update of index inside loop body
  # index is never updated and is always 0

# Output
index:0, fruits
index:0, cookies
index:0, cereals
index:0, protein bars
index:0, post-it notes

Další běžný vzor použití cyklu for je ve spojení s funkcí range(). To se dozvíme v další části.

  Systemd změní, jak váš domovský adresář Linuxu funguje

Jak používat funkci range() pro přístup k indexu

Funkce len() vestavěná v Pythonu vrací délku libovolného objektu Pythonu. Můžete tedy zavolat funkci len() s argumentem nákupní_seznam, abyste získali délku nákupního_seznamu (což je v tomto případě 5).

len(shopping_list)
# Output: 5

Funkce range() vrací objekt range, který pak můžete použít ve smyčce. Když procházíte rozsahem (stop), dostanete indexy 0, 1, 2,…, stop-1.

Nastavením stop = len(seznam) získáte seznam platných indexů. Takže pomocí funkce range() získáte přístup k indexu i k odpovídající položce, jak je znázorněno níže.

for index in range(len(shopping_list)):
  print(f"index:{index}, item: {shopping_list[index]}")

# Output
index:0, item: fruits
index:1, item: cookies
index:2, item: cereals
index:3, item: protein bars
index:4, item: post-it notes

Toto však není doporučený způsob Pythonic pro současný přístup k indexům i položkám.

Syntaxe funkce Python enumerate()

Funkce enumerate() Pythonu vám umožňuje přistupovat k položkám spolu s jejich indexy pomocí následující obecné syntaxe:

enumerate(<iterable>, start = 0)

Ve výše uvedené syntaxi:

  • je povinný parametr a může to být libovolný iterovatelný Python, jako je seznam nebo n-tice.
  • start je volitelný parametr, který řídí index, od kterého začíná počítání. Pokud nezadáte hodnotu start, výchozí je nula.

Nyní můžete zavolat funkci enumerate() s shopping_list a ta vrátí objekt enumerate, jak je znázorněno v buňce kódu níže.

enumerate(shopping_list)
<enumerate at 0x7f91b4240410>

Objekt výčtu nelze opakovat. Pojďme tedy převést objekt enumerate na seznam Pythonu.

list(enumerate(shopping_list))

# Output
[(0, 'fruits'),
 (1, 'cookies'),
 (2, 'cereals'),
 (3, 'protein bars'),
 (4, 'post-it notes')]

Další metodou přístupu k položkám objektu enumerate je volání funkce next(). s objektem enumerate jako argumentem. V Pythonu funkce next() vrací další položku z iterátoru.

Interně funguje funkce next() voláním metody __next__ na objektu iterátoru pro načtení po sobě jdoucích položek.

Přiřaďme objekt enumerate proměnné shopping_list_enum.

shopping_list_enum = enumerate(shopping_list)

Když poprvé zavoláte next() s shopping_list_enum, dostanete index nula a položku na indexu 0: n-tici (0, ‚ovoce‘).

Když budete pokračovat ve volání funkce next(), získáte po sobě jdoucí položky spolu s jejich indexy, jak je popsáno níže.

next(shopping_list_enum)
# (0, 'fruits')
next(shopping_list_enum)
# (1, 'cookies')
next(shopping_list_enum)
# (2, 'cereals')
next(shopping_list_enum)
# (3, 'protein bars')
next(shopping_list_enum)
# (4, 'post-it notes')

Co se stane, když zavoláte funkci next() poté, co zpřístupníte všechny položky a dostanete se na konec seznamu? Zobrazí se chyba StopIteration.

next(shopping_list_enum)
# ---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-16-4220f68f6c7e> in <module>()
----> 1 next(shopping_list_enum)

StopIteration:

Funkce enumerate() vrací po sobě jdoucí indexy a položky pouze v případě potřeby a nejsou počítány předem. V projektech Pythonu, kde potřebujete vzít v úvahu efektivitu paměti, můžete zkusit použít funkci enumerate(), když potřebujete procházet velké iterovatelné položky.

Příklady funkcí Python enumerate().

Nyní, když jsme se naučili syntaxi pro použití funkce enumerate(), pojďme upravit cyklus for, který jsme měli dříve.

Z předchozí části víme, že procházením objektu enumerate se vrací n-tice s indexem a položkou. Tuto n-tici můžeme rozbalit na dvě proměnné: index a položku.

for index, item in enumerate(shopping_list):
  print(f"index:{index}, item:{item}")

# Output
index:0, item:fruits
index:1, item:cookies
index:2, item:cereals
index:3, item:protein bars
index:4, item:post-it notes

Dále se podívejme, jak zadat vlastní počáteční hodnotu.

Jak enumerate() s vlastní počáteční hodnotou

Python se řídí nulovým indexováním, takže počáteční hodnota je ve výchozím nastavení 0. Pokud však potřebujete indexy ve formě čitelné pro člověka – počínaje 1 nebo jakýmkoli jiným indexem podle vašeho výběru, můžete zadat vlastní počáteční hodnotu.

Pokud v příkladu nákupního seznamu chcete začít počítat od 1, nastavte začátek = 1.

for index, item in enumerate(shopping_list,1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

Při zadávání vlastní počáteční hodnoty byste si však měli být jisti, že ji zadáte jako druhý poziční argument.

Pokud omylem zaměníte pořadí iterovatelné a počáteční hodnoty, narazíte na chybu, jak je vysvětleno v buňce kódu níže.

for index, item in enumerate(1,shopping_list):
  print(f"index:{index}, item:{item}")

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-12-5dbf7e2749aa> in <module>()
----> 1 for index, item in enumerate(1,shopping_list):
      2   print(f"index:{index}, item:{item}")

TypeError: 'list' object cannot be interpreted as an integer

Chcete-li se těmto chybám vyhnout, můžete zadat začátek jako argument klíčového slova, jak je uvedeno níže.

for index, item in enumerate(shopping_list, start = 1):
  print(f"index:{index}, item:{item}")

# Output
index:1, item:fruits
index:2, item:cookies
index:3, item:cereals
index:4, item:protein bars
index:5, item:post-it notes

Zatím jste se naučili používat funkci enumerate() se seznamy Pythonu. Funkci enumerate můžete také použít k procházení řetězců, slovníků a n-tic Pythonu.

Jak používat funkci enumerate() s pythonovými n-ticemi

Předpokládejme, že nákupní_seznam je n-tice. V Pythonu jsou n-tice také kolekcemi – podobně jako seznamy Pythonu, ale jsou neměnné. Proto je nemůžete upravit a pokus o to povede k chybě.

Následující fragment kódu inicializuje nákupní_seznam jako n-tici.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
type(shopping_list)
# Tuple

Pokud se pokusíte upravit první položku v n-tice, zobrazí se chyba, protože n-tice Python je neměnná kolekce.

shopping_list[0] = 'vegetables'

# Output
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-ffdafa961600> in <module>()
----> 1 shopping_list[0] = 'vegetables'

TypeError: 'tuple' object does not support item assignment

▶ Nyní spusťte následující fragment kódu, abyste ověřili, že funkce enumerate() funguje s n-ticemi podle očekávání.

shopping_list = ("fruits","cookies","cereals","protein bars","post-it notes")
for index, item in enumerate(shopping_list):
    print(f"index:{index}, item:{item}")

Jak používat funkci enumerate() s řetězci Python

Můžete také použít funkci Python enumerate() pro procházení řetězců a současný přístup ke znakům a indexům.

Zde je příklad.

py_str="Butterfly"
for index, char in enumerate(py_str):
  print(f"index {index}: {char}")

# Output
index 0: B
index 1: u
index 2: t
index 3: t
index 4: e
index 5: r
index 6: f
index 7: l
index 8: y

Z výše uvedeného výstupu vidíme, že znaky spolu s jejich indexy (0-8) byly vytištěny.

Závěr👩🏽‍💻

Zde je souhrn toho, co jste se naučili.

  • Pro přístup k položkám a udržování samostatné proměnné čítače nebo indexu můžete použít smyčky for.
  • Pokud chcete, můžete pomocí funkce range() získat platné indexy a přistupovat k položkám indexováním v seznamu.
  • Jako doporučený způsob Pythonic můžete použít funkci enumerate() Pythonu se syntaxí: enumerate(iterable). Ve výchozím nastavení začíná počet nebo index na 0.
  • Můžete zadat vlastní počáteční hodnotu pomocí syntaxe enumerate(iterable, start), abyste získali index začínající hodnotou start a odpovídající položky.
  • Funkci enumerate můžete použít při práci s n-ticemi, řetězci, slovníky a obecně s jakýmkoli iterovatelným Pythonem.

Doufám, že vám tento tutoriál o funkci enumerate() pomohl. Dále se naučte, jak najít index položky v seznamech Pythonu. Pokračujte v kódování!