Jak znaleźć indeks elementu na listach Pythona?

W tym przewodniku dowiesz się, jak znaleźć indeks elementu na liście Pythona, zarówno przy użyciu prostych iteracji, jak i wbudowanej metody listy index().

Podczas pracy z listami Pythona może być konieczne znalezienie indeksu, w którym występuje określony element. Możesz to zrobić poprzez:

  • Przeglądanie listy i sprawdzanie, czy pozycja w bieżącym indeksie jest równa określonej wartości
  • Korzystanie z wbudowanej metody listy index()

Dowiesz się obu powyższych w tym samouczku. Zacznijmy.👩🏽‍💻

Listy Pythona, ponownie

W Pythonie lista jest zbiorem elementów — tego samego lub różnych typów danych. Są zmienne; możesz je modyfikować na miejscu bez konieczności tworzenia nowej listy.

Rozważ ten przykładowy owoc: lista 5 różnych owoców.

fruits = ["apple","mango","strawberry","pomegranate","melon"]

Długość dowolnego obiektu Pythona można uzyskać za pomocą wbudowanej funkcji len(). Możesz więc wywołać funkcję len() z obiektem listy (owoce) jako argumentem, aby uzyskać jej długość, jak pokazano poniżej.

len(fruits)
# Output: 5

W tym samouczku użyjemy listy owoców jako działającego przykładu.

Indeksowanie w listach Pythona

Python podąża za indeksowaniem zerowym. Tak więc w każdym iterowalnym Pythonie pierwszy element znajduje się pod indeksem 0, drugi pod indeksem 1 i tak dalej. Jeśli długość elementu iterowalnego wynosi k, to ostatni element znajduje się pod indeksem k – 1.

W Pythonie możesz użyć funkcji range(), aby uzyskać indeksy podczas przechodzenia przez iterable.

Uwaga: Przechodząc przez zakres (k), otrzymujesz indeksy 0,1,2,…,(k-1). Tak więc ustawiając k = len(list), możesz uzyskać listę wszystkich ważnych indeksów.

Wyjaśnia to następująca komórka kodu.

for i in range(len(fruits)):
  print(f"i:{i}, fruit[{i}] is {fruits[i]}")

# Output
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

Teraz, gdy omówiliśmy podstawy list w Pythonie, nauczmy się, jak znaleźć indeks elementu na liście.

Znajdź indeks elementu listy według iteracji za pomocą pętli

Rozważmy listę owoców z poprzedniej sekcji. Dowiemy się, jak znaleźć indeks określonego elementu na tej liście, wykonując iterację za pomocą pętli for.

Używanie funkcji pętli i zakresu()

Ustalmy cel: wartość, której szukamy na liście.

Możesz użyć funkcji for loop i range(), aby uzyskać listę indeksów od 0 do len(fruits) – 1.

  • Przeglądaj listę owoców uzyskujących dostęp do każdego indeksu.
  • Sprawdź, czy pozycja w bieżącym indeksie i jest równa wartości docelowej.
  • Jeśli True, wydrukuj, że cel został znaleziony w indeksie i.
fruits = ["apple","mango","strawberry","pomegranate","melon"]

target = "mango"

for i in range(len(fruits)):
  if fruits[i] == target:
   print(f"{target} found at index {i}")

# Output
mango found at index 1

W tym przykładzie docelowy ciąg „mango” pojawia się dokładnie raz (pod indeksem 1) na liście owoców.

Czasami jednak wartość docelowa pojawia się więcej niż raz lub wcale. Aby poradzić sobie z tymi przypadkami, zmodyfikujmy powyższe pętle i zapakuj zawartość wewnątrz funkcji o nazwie find_in_list.

Zrozumienie definicji funkcji

Funkcja find_in_list ma dwa parametry:

  • cel: wartość, której szukasz, oraz
  • py_list: lista Pythona, którą przeszukujesz.
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("Sorry, target not found!")
  else:
    print(f"{target} is found at indices {target_indices}")

W ciele funkcji inicjujemy pustą listę target_indices. Przechodzimy przez listę i uzyskujemy dostęp do elementów listy. Jeśli cel został znaleziony pod określonym indeksem, dodajemy ten indeks do listy target_indices za pomocą metody append().

Uwaga: W Pythonie list.append(item) dodaje pozycję na końcu listy.

  • Jeśli cel nigdy nie zostanie znaleziony, to target_indices jest pustą listą; użytkownik jest powiadamiany, że celu nie ma na liście.
  • Jeśli cel znajduje się w więcej niż jednym indeksie, to target_indices zawiera wszystkie te indeksy.

Następnie przedefiniujmy listę owoców, jak pokazano.

Tym razem szukamy ciągu docelowego „mango”, który występuje dwukrotnie — przy indeksach 1 i 4.

fruits = ["apple","mango","strawberry","pomegranate","mango","melon"]
target = "mango"
find_in_list(target,fruits)

# Output
mango is found at indices [1, 4]

Po wywołaniu funkcji find_in_list z argumentami target i fruit widzimy, że zwracane są oba indeksy.

target = "turnip"
find_in_list(target,fruits)

# Output
Sorry, target not found!

Jeśli spróbujesz wyszukać „rzepa”, której nie ma na liście owoców, otrzymasz komunikat, że cel nie został znaleziony.

Używanie funkcji pętli i enumerate()

W Pythonie możesz użyć funkcji enumerate(), aby uzyskać dostęp do indeksu i elementów jednocześnie — bez konieczności używania funkcji range().

Poniższa komórka kodu pokazuje, w jaki sposób można użyć funkcji enumerate(), aby uzyskać zarówno indeksy, jak i elementy.

fruits = ["apple","mango","strawberry","pomegranate","mango","melon"]
for index,fruit in enumerate(fruits):
  print(f"Index {index}: {fruit}")

# Output
Index 0: apple
Index 1: mango
Index 2: strawberry
Index 3: pomegranate
Index 4: mango
Index 5: melon

Teraz przepiszmy funkcję Pythona, aby znaleźć indeks elementów na liście za pomocą funkcji 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("Sorry, target not found!")
  else:
    print(f"{target} is found at indices {target_indices}")

Podobnie jak w poprzedniej sekcji, możesz teraz wywołać funkcję find_in_list z prawidłowymi argumentami.

Możesz przetłumaczyć powyższą definicję funkcji na równoważną listę składaną i zrobimy to w następnej sekcji.

Znajdź indeks elementu listy według iteracji przy użyciu rozumienia listy

Listy składane w Pythonie umożliwiają tworzenie list z istniejących list na podstawie pewnych warunków. Oto ogólna konstrukcja:

new_list = [<output> for <items in existing iterables> if <condition is true>] 

Poniższy rysunek opisuje, jak zidentyfikować elementy rozumienia listy; używając tego, możesz przekonwertować funkcję find_in_list na listę składaną.

Korzystając z powyższego, wyrażenie dla zrozumienia listy do tworzenia indeksów docelowych jest następujące.

target_indices = [index for index,fruit in enumerate(fruits) if fruit==target]

W ramach ćwiczenia możesz spróbować uruchomić powyższy fragment kodu dla kilku innych przykładów.

Znajdź indeks elementu listy za pomocą metody index()

Aby znaleźć indeks elementu na liście Pythona, możesz również użyć wbudowanej metody .index(). Oto ogólna składnia:

list.index(value,start,end)

Parsowanie powyższej metody:

  • wartość to wartość docelowa, której szukasz.
  • początek i koniec są opcjonalnymi argumentami pozycyjnymi; możesz ich użyć do wyszukiwania, aby znaleźć indeks elementu na wycinku listy, zaczynając od początku i rozciągając się do końca – 1.

Uwaga: Metoda .index() zwraca tylko indeks pierwszego wystąpienia wartości na liście. Nawet jeśli znajdziesz indeks elementu na wycinku listy [start: end-1]ta metoda zwraca tylko indeks odpowiadający pierwszemu wystąpieniu elementu.

Wróćmy do naszego przykładu, aby zrozumieć, jak działa metoda .index().

fruits = ["apple","mango","strawberry","pomegranate","mango","melon"]
target = "mango"

fruits.index(target)
1

Mimo że na liście owoców występują dwa wystąpienia „mango”, widać, że zwrócono tylko indeks pierwszego wystąpienia.

Aby uzyskać indeks drugiego wystąpienia mango, możemy przeszukać wycinek listy, zaczynając od indeksu 2 i rozciągając się do indeksu 5, jak pokazano poniżej.

fruits.index(target,2,5)
4

Jak radzić sobie z błędami wartości w Pythonie?

Zobaczmy teraz, co się stanie, jeśli spróbujesz znaleźć indeks elementu, którego nie ma na liście, powiedzmy „marchewka”.

target = "carrot"

fruits.index(target)

# Output
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-17-81bd454e44f7> in <module>()
      1 target = "carrot"
      2 
----> 3 fruits.index(target)

ValueError: 'carrot' is not in list

Jak widać w komórce kodu powyżej, rzuca to Błąd wartości. W Pythonie możesz obsłużyć to jako wyjątek za pomocą bloków try andexcept.

Ogólna składnia do używania try-except jest następująca.

try:
  # to do this
except <ErrorType>:
  # do this to handle <ErrorType> as exception

Używając powyższych bloków try-except, możemy obsłużyć ValueError jako wyjątek.

target = "carrot"
try:
  fruits.index(target)
except ValueError:
  print(f"Sorry, could not find {target} in list")

# Output
Sorry, could not find carrot in list

Powyższy kod wykonuje następujące czynności:

  • Jeśli cel znajduje się na liście, zwraca indeks celu.
  • Jeśli cel nie istnieje, traktuje ValueError jako wyjątek i wyświetla komunikat o błędzie.

Podsumowując

Oto podsumowanie różnych metod wyszukiwania indeksu pozycji na liście Pythona, których się nauczyłeś.

  • Możesz użyć funkcji pętli for i range() Pythona, aby uzyskać elementy i ich indeksy. Sprawdź, czy pozycje w indeksach pasują do celu.
  • Możesz również użyć funkcji enumerate(), aby jednocześnie uzyskać dostęp do elementu i indeksu.
  • Możesz użyć obu powyższych metod wewnątrz wyrażenia listowego.
  • Aby znaleźć indeks elementu na liście, możesz również użyć wbudowanej metody .index().
  • list.index(wartość) zwraca indeks pierwszego wystąpienia wartości na liście. Jeśli wartość nie jest obecna, zgłasza ValueError.
  • Możesz przeszukiwać określony wycinek listy za pomocą list.index(wartość, początek, koniec), aby wyszukać wystąpienie wartości w tym wycinku listy [start:end-1].

Następnie naucz się sortować słownik Pythona według klucza lub według wartości. Szczęśliwego programowania w Pythonie!