Hur man hittar indexet för ett objekt i Python-listor

I den här guiden lär du dig hur du hittar indexet för ett element i en Python-lista, både med enkla iterationer och en inbyggd listmetod index().

När du arbetar med Python-listor kan du behöva ta reda på indexet där ett visst objekt förekommer. Du kan göra detta genom att:

  • Går igenom listan och kontrollerar om objektet i det aktuella indexet är lika med det specifika värdet
  • Använder den inbyggda listmetoden index()

Du kommer att lära dig båda ovanstående i denna handledning. Låt oss komma igång.👩🏽‍💻

Pythonlistor, återbesökt

I Python är en lista en samling objekt – av samma eller olika datatyper. De är föränderliga; du kan ändra dem på plats utan att behöva skapa en ny lista.

Betrakta detta exempel frukter: en lista med 5 olika frukter.

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

Du kan få längden på vilket Python-objekt som helst genom att använda den inbyggda len()-funktionen. Så du kan anropa len()-funktionen med listobjektet (frukter) som argument för att få dess längd, som visas nedan.

len(fruits)
# Output: 5

Vi kommer att använda fruktlistan som ett löpande exempel i denna handledning.

Indexering i Python-listor

Python följer noll indexering. Så i alla Python iterable, är det första objektet vid index 0, det andra objektet är vid index 1, och så vidare. Om längden på den iterbara är k, är den sista posten vid indexet k – 1.

I Python kan du använda range()-funktionen för att få index när du går igenom iterables.

Notera: När du går genom intervall(k) får du indexen 0,1,2,…,(k-1). Så genom att ställa in k = len(lista) kan du få en lista över alla giltiga index.

Följande kodcell förklarar detta.

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

Nu när vi har täckt grunderna i Python-listor, låt oss lära oss hur man hittar indexet för ett objekt i en lista.

Hitta index för ett listobjekt genom iteration med för loopar

Låt oss överväga listfrukterna från föregående avsnitt. Vi lär oss hur du hittar indexet för ett specifikt objekt i den här listan genom iteration med för loop.

Använder för Loop och range() Funktion

Låt oss fixa mål: värdet vi söker efter i listan.

Du kan använda funktionen loop och range() för att få en lista över index från 0 till len(fruits) – 1.

  • Gå igenom listan över frukter som kommer åt varje index.
  • Kontrollera om objektet vid det aktuella indexet i är lika med målet.
  • Om det är sant, skriv ut att målet har hittats vid indexet 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

I det här exemplet visas målsträngen ’mango’ exakt en gång (vid index 1) i listfrukterna.

Men ibland visas målvärdet mer än en gång eller inte alls. För att hantera dessa fall, låt oss ändra ovanstående looping och linda innehållet i en funktion som heter find_in_list.

Förstå funktionsdefinitionen

Funktionen find_in_list har två parametrar:

  • mål: värdet du söker efter, och
  • py_list: Python-listan som du söker igenom.
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}")

I funktionskroppen initierar vi en tom lista target_index. Vi går igenom listan och kommer åt listobjekten. Om målet har hittats vid ett visst index lägger vi till det indexet till target_indexes-listan med metoden append().

Obs: I Python lägger list.append(item) till objekt i slutet av listan.

  • Om målet aldrig hittas är target_index en tom lista; användaren meddelas att målet inte finns i listan.
  • Om målet hittas i mer än ett index, innehåller target_index alla dessa index.

Låt oss sedan omdefiniera fruktlistan som visas.

Den här gången söker vi efter målsträngen ’mango’, som förekommer två gånger – vid index 1 och 4.

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

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

När vi anropar funktionen find_in_list med target och fruits som argument ser vi att båda indexen returneras.

target = "turnip"
find_in_list(target,fruits)

# Output
Sorry, target not found!

Om du försöker söka efter ’kålrot’ som inte finns i fruktlistan får du ett meddelande om att målet inte har hittats.

Använder funktionen Loop och enumerate().

I Python kan du använda enumerate()-funktionen för att komma åt både indexet och objekten samtidigt – utan att behöva använda range()-funktionen.

Följande kodcell visar hur du kan använda funktionen enumerate() för att få både indexen och objekten.

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

Låt oss nu skriva om Python-funktionen för att hitta indexet för objekt i listan med enumerate()-funktionen.

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}")

Som med föregående avsnitt kan du nu anropa find_in_list-funktionen med giltiga argument.

Du kan översätta ovanstående funktionsdefinition till en likvärdig listförståelse och vi kommer att göra det i nästa avsnitt.

Hitta index för ett listobjekt genom iteration med hjälp av listförståelse

Listförståelse i Python låter dig skapa listor från befintliga listor baserat på något villkor. Här är den allmänna konstruktionen:

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

Figuren nedan beskriver hur man identifierar elementen i listförståelse; med detta kan du konvertera funktionen find_in_list till en listförståelse.

Med hjälp av ovanstående är uttrycket för listförståelse för att skapa målindex som följer.

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

Som en övning kan du prova att köra ovanstående kodavsnitt för några andra exempel.

Hitta index för ett listobjekt med metoden index()

För att hitta indexet för ett objekt i en Python-lista kan du också använda den inbyggda .index()-metoden. Här är den allmänna syntaxen:

list.index(value,start,end)

Analysera ovanstående metod:

  • värde är målvärdet som du söker efter.
  • start och slut är valfria positionsargument; du kan använda dem för att söka hitta indexet för ett objekt i listdelen från början och sträcker sig upp till slutet – 1.

Obs! Metoden .index() returnerar endast indexet för den första förekomsten av värde i listan. Även när du hittar index för ett objekt i ett listsegment [start: end-1]returnerar denna metod endast det index som motsvarar den första förekomsten av objektet.

Låt oss återgå till vårt exempel för att förstå hur metoden .index() fungerar.

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

fruits.index(target)
1

Även om det finns två förekomster av ’mango’ i fruktlistan, kan du se att endast indexet för den första förekomsten har returnerats.

För att få indexet för den andra förekomsten av mango kan vi söka igenom listsegmentet som börjar vid index 2 och sträcker sig upp till index 5, som visas nedan.

fruits.index(target,2,5)
4

Hur man hanterar ValueErrors i Python

Låt oss nu se vad som händer om du försöker hitta indexet för ett objekt som inte finns i listan, säg ”morot”.

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

Som framgår av kodcellen ovan, kastar detta en ValueError. I Python kan du hantera detta som ett undantag genom att använda blocken try och except.

Den allmänna syntaxen för att använda try-except är följande.

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

Genom att använda ovanstående try-except-block kan vi hantera ValueError som ett undantag.

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

Ovanstående kod gör följande:

  • Om målet finns i listan returnerar det målets index.
  • Om målet inte finns hanterar det ValueError som ett undantag och skriver ut felmeddelandet.

Summering

Här är en sammanfattning av de olika metoderna du har lärt dig för att hitta indexet för ett objekt i en Python-lista.

  • Du kan använda Pythons funktion för loop och range() för att få objekten och deras respektive index. Kontrollera om objekten på indexen matchar målet.
  • Du kan också använda funktionen enumerate() för att samtidigt komma åt objektet och indexet.
  • Du kan använda båda ovanstående metoder i ett listförståelseuttryck.
  • För att hitta ett objekts index i en lista kan du också använda den inbyggda metoden .index().
  • list.index(value) returnerar indexet för den första förekomsten av värde i listan. Om värdet inte finns, väcker det ett ValueError.
  • Du kan söka igenom en viss del av listan med list.index(värde, start, slut) för att söka efter förekomsten av ett värde i listsegmentet [start:end-1].

Därefter lär du dig att sortera en Python-ordbok efter nyckel eller värde. Glad Python-programmering!