Tento návod vám ukáže, jak v Pythonu nalézt pozici (index) konkrétního prvku v seznamu. Prozkoumáme jak tradiční iterace, tak i vestavěnou metodu `index()` seznamu.
Při práci se seznamy v Pythonu je běžné, že potřebujete zjistit, na kterém místě (indexu) se nachází určitá položka. Existují dva hlavní způsoby, jak toho dosáhnout:
- Procházení seznamu a ověřování, zda prvek na dané pozici odpovídá hledané hodnotě.
- Použití přímo vestavěné metody `index()` seznamu.
V tomto tutoriálu se seznámíme s oběma postupy. Pojďme na to! 👩🏽💻
Opakování o seznamech v Pythonu
V Pythonu je seznam uspořádaná kolekce položek. Mohou to být prvky stejného datového typu, nebo i různé. Seznamy jsou měnitelné, to znamená, že je můžeme upravovat přímo, aniž bychom museli vytvářet nový seznam.
Zvažme příklad seznamu ovoce, který obsahuje pět různých druhů.
fruits = ["apple","mango","strawberry","pomegranate","melon"]
Délku jakéhokoli objektu v Pythonu zjistíme pomocí funkce `len()`. Stejně tak můžeme zavolat funkci `len()` s objektem seznamu (např. `fruits`) jako argumentem, abychom získali jeho délku.
len(fruits) # Výstup: 5
V tomto tutoriálu budeme používat seznam ovoce jako náš ukázkový příklad.
Indexování v seznamech Pythonu
V Pythonu se používá indexování od nuly. To znamená, že první prvek v jakékoli iterovatelné struktuře má index 0, druhý prvek má index 1 a tak dále. Pokud má iterovatelná struktura `k` prvků, poslední prvek má index `k – 1`.
V Pythonu můžeme pomocí funkce `range()` generovat posloupnost indexů při procházení iterovatelných struktur.
Poznámka: Při použití `range(k)` získáte indexy 0, 1, 2, …, (k-1). Takže pokud nastavíme `k` na `len(seznam)`, můžeme získat všechny platné indexy seznamu.
Následující kód to demonstruje:
for i in range(len(fruits)): print(f"i:{i}, fruit[{i}] is {fruits[i]}") # Výstup i:0, fruit[0] is apple i:1, fruit[1] is mango i:2, fruit[2] is strawberry i:3, fruit[3] is pomegranate i:4, fruit[4] is melon
Nyní, když jsme si zopakovali základy seznamů, se můžeme podívat, jak najít index konkrétního prvku v seznamu.
Hledání indexu prvku iterací pomocí cyklu `for`
Vraťme se k seznamu ovoce z předchozí části. Naučíme se, jak zjistit index konkrétní položky v tomto seznamu pomocí cyklu `for`.
Použití cyklu `for` a funkce `range()`
Stanovme si cíl: hodnotu, kterou hledáme v seznamu.
Pro generování posloupnosti indexů od 0 do `len(ovoce) – 1` můžeme použít cyklus `for` v kombinaci s funkcí `range()`.
- Projdeme seznam `fruits`, přičemž v každém kroku máme přístup k indexu.
- Ověříme, zda prvek na aktuálním indexu `i` odpovídá hledané hodnotě.
- Pokud se prvek rovná hledané hodnotě, vypíšeme zprávu o tom, že byl prvek nalezen na daném indexu `i`.
fruits = ["apple","mango","strawberry","pomegranate","melon"] target = "mango" for i in range(len(fruits)): if fruits[i] == target: print(f"{target} nalezen na indexu {i}") # Výstup mango nalezen na indexu 1
V tomto příkladu se řetězec ‚mango‘ v seznamu `fruits` vyskytuje pouze jednou, a to na indexu 1.
Někdy se však hledaná hodnota může vyskytovat vícekrát, nebo se v seznamu nemusí nacházet vůbec. Abychom zvládli i tyto situace, upravíme předchozí cyklus a umístíme jej do funkce s názvem `find_in_list`.
Porozumění definici funkce
Funkce `find_in_list` přijímá dva parametry:
- `target`: hodnota, kterou hledáme, a
- `py_list`: seznam v Pythonu, ve kterém hledáme.
def find_in_list(target,py_list): target_indices = [] for i in range(len(fruits)): if fruits[i] == target: target_indices.append(i) if target_indices == []: print("Hledaný prvek nebyl nalezen!") else: print(f"{target} se nachází na indexech {target_indices}")
V těle funkce nejprve vytvoříme prázdný seznam `target_indices`. Potom procházíme seznam a ověřujeme, zda se aktuální prvek shoduje s hledanou hodnotou. Pokud ano, index aktuálního prvku přidáme do seznamu `target_indices` pomocí metody `append()`.
Poznámka: V Pythonu `list.append(item)` přidá položku na konec seznamu.
- Pokud se hledaný prvek nenajde, zůstane seznam `target_indices` prázdný a uživateli se zobrazí zpráva o tom, že hledaný prvek v seznamu nebyl nalezen.
- Pokud se hledaný prvek nachází na více indexech, bude seznam `target_indices` obsahovat všechny tyto indexy.
Nyní si předefinujeme seznam `fruits`, jak je ukázáno níže.
Tentokrát hledáme řetězec ‚mango‘, který se v seznamu vyskytuje dvakrát – na indexech 1 a 4.
fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] target = "mango" find_in_list(target,fruits) # Výstup mango se nachází na indexech [1, 4]
Při volání funkce `find_in_list` s parametry `target` a `fruits` vidíme, že se nám vrátí oba indexy, na kterých se ‚mango‘ v seznamu nachází.
target = "turnip" find_in_list(target,fruits) # Výstup Hledaný prvek nebyl nalezen!
Pokud se pokusíme vyhledat řetězec ‚turnip‘ (tuřín), který se v seznamu `fruits` nenachází, zobrazí se nám zpráva o tom, že hledaný prvek nebyl nalezen.
Použití cyklu `for` a funkce `enumerate()`
V Pythonu můžeme použít funkci `enumerate()` pro současný přístup k indexu a prvkům, aniž bychom museli použít funkci `range()`.
Následující kód ukazuje, jak můžeme funkci `enumerate()` použít pro získání indexů a prvků.
fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] for index,fruit in enumerate(fruits): print(f"Index {index}: {fruit}") # Výstup Index 0: apple Index 1: mango Index 2: strawberry Index 3: pomegranate Index 4: mango Index 5: melon
Nyní přepíšeme funkci v Pythonu, abychom nalezli index prvků v seznamu s využitím funkce `enumerate()`.
def find_in_list(target,py_list): target_indices = [] for index, fruit in enumerate(fruits): if fruit == target: target_indices.append(index) if target_indices == []: print("Hledaný prvek nebyl nalezen!") else: print(f"{target} se nachází na indexech {target_indices}")
Stejně jako v předchozí části můžeme i nyní volat funkci `find_in_list` s platnými argumenty.
Výše uvedenou definici funkce můžeme transformovat do ekvivalentního list comprehension, což uděláme v následující sekci.
Hledání indexu prvku pomocí list comprehension
List comprehension v Pythonu umožňuje vytvářet nové seznamy na základě existujících seznamů s použitím dané podmínky. Obecný zápis je následující:
new_list = [<výstup> for <položka in existující iterovatelná struktura> if <podmínka je splněna>]
Obrázek níže popisuje, jak identifikovat prvky list comprehension. Použitím tohoto schématu můžeme převést funkci `find_in_list` na list comprehension.
Při použití výše uvedeného schématu můžeme list comprehension pro nalezení indexů definovat takto:
target_indices = [index for index,fruit in enumerate(fruits) if fruit==target]
Jako cvičení si můžete zkusit spustit výše uvedený kód pro několik dalších příkladů.
Hledání indexu prvku pomocí metody `index()`
Pro nalezení indexu prvku v seznamu Python můžeme použít také vestavěnou metodu `.index()`. Obecný zápis je následující:
list.index(value,start,end)
Rozbor výše uvedené metody:
- `value`: hledaná hodnota
- `start` a `end`: nepovinné poziční argumenty. Tyto argumenty nám umožňují prohledávat index prvku v daném podrozsahu seznamu, začínajícím indexem `start` a končícím indexem `end – 1`.
Poznámka: Metoda `.index()` vrací pouze index prvního výskytu hledané hodnoty v seznamu. I když hledáme index položky v daném rozsahu, metoda vrátí index pouze prvního výskytu.
Vraťme se k našemu příkladu, abychom si ukázali, jak metoda `.index()` funguje.
fruits = ["apple","mango","strawberry","pomegranate","mango","melon"] target = "mango" fruits.index(target) 1
I když se v seznamu `fruits` vyskytují dvě slova „mango“, je nám vrácen pouze index prvního výskytu.
Pokud chceme získat index druhého výskytu slova „mango“, můžeme prohledávat jen část seznamu, počínaje indexem 2 a konče indexem 5, jak ukazuje následující příklad:
fruits.index(target,2,5) 4
Jak zpracovat `ValueError` v Pythonu
Podívejme se, co se stane, pokud se pokusíme najít index položky, která se v seznamu nenachází, například ‚carrot‘ (mrkev).
target = "carrot" fruits.index(target) # Výstup --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-17-81bd454e44f7> in <module>() 1 target = "carrot" 2 ----> 3 fruits.index(target) ValueError: 'carrot' není v seznamu
Jak je vidět na výstupu, vyvolá se výjimka `ValueError`. V Pythonu můžeme tuto výjimku ošetřit pomocí bloků `try` a `except`.
Obecný zápis použití `try-except` je následující:
try: # proveď tento kód except <TypChyby>: # proveď tento kód pro ošetření výjimky <TypChyby>
Pomocí bloků `try-except` můžeme ošetřit výjimku `ValueError`.
target = "carrot" try: fruits.index(target) except ValueError: print(f"Hledaný prvek {target} nebyl v seznamu nalezen") # Výstup Hledaný prvek carrot nebyl v seznamu nalezen
Výše uvedený kód dělá následující:
- Pokud se hledaný prvek v seznamu nachází, vrátí jeho index.
- Pokud se hledaný prvek v seznamu nenachází, ošetří výjimku `ValueError` a vypíše chybovou zprávu.
Shrnutí
Zde je shrnutí různých metod, které jsme se naučili pro nalezení indexu prvku v seznamu v Pythonu.
- K získání prvků a jejich indexů můžeme použít cyklus `for` s funkcí `range()`. Poté ověříme, zda prvky na daných indexech odpovídají hledané hodnotě.
- Pro současný přístup k prvku a jeho indexu můžeme použít funkci `enumerate()`.
- Obě výše uvedené metody lze použít v list comprehension.
- Pro nalezení indexu prvku v seznamu můžeme použít vestavěnou metodu `.index()`.
- `list.index(value)` vrátí index prvního výskytu hledané hodnoty v seznamu. Pokud se hledaná hodnota v seznamu nenachází, vyvolá se výjimka `ValueError`.
- Můžeme prohledávat jen určitou část seznamu pomocí `list.index(value, start, end)`, kde hledáme výskyt hodnoty v podrozsahu seznamu `[start:end-1]`.
Dále se můžete naučit jak seřadit slovník v Pythonu podle klíče nebo hodnoty. Šťastné programování v Pythonu!