Как да намерите индекса на елемент в списъците на Python

В това ръководство ще научите как да намерите индекса на елемент в списък на Python, като използвате както прости итерации, така и вграден метод за списък index().

Когато работите със списъци на Python, може да се наложи да откриете индекса, на който се среща определен елемент. Можете да направите това чрез:

  • Преминаване през списъка и проверка дали елементът в текущия индекс е равен на конкретната стойност
  • Използване на вградения списък метод index()

Ще научите и двете по-горе в този урок. Да започваме.👩🏽‍💻

Списъци на Python, преразгледани

В Python списъкът е колекция от елементи – от един и същи или различни типове данни. Те са променливи; можете да ги промените на място, без да се налага да създавате нов списък.

Помислете за този пример за плодове: списък от 5 различни плода.

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

Можете да получите дължината на всеки обект на Python, като използвате вградената функция len(). Така че можете да извикате функцията len() със списък обект (плодове) като аргумент, за да получите неговата дължина, както е показано по-долу.

len(fruits)
# Output: 5

Ще използваме списъка с плодове като работещ пример в този урок.

Индексиране в списъци на Python

Python следва нулево индексиране. Така че във всеки итерируем на Python първият елемент е с индекс 0, вторият елемент е с индекс 1 и т.н. Ако дължината на итерируемия е k, тогава последният елемент е с индекс k – 1.

В Python можете да използвате функцията range(), за да получите индекси, докато преминавате през итерируеми елементи.

Забележка: Когато преминавате през диапазон (k), получавате индексите 0,1,2,…,(k-1). Така че, като зададете k = len(list), можете да получите списъка с всички валидни индекси.

Следната кодова клетка обяснява това.

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

Сега, след като разгледахме основите на списъците на Python, нека научим как да намираме индекса на елемент в списък.

  Как да получите миксер за обем за Chrome Tabs

Намиране на индекс на елемент от списък чрез итерация с помощта на for цикли

Нека разгледаме списъка с плодове от предишния раздел. Ще научим как да намираме индекса на конкретен елемент в този списък чрез итерация с помощта на цикъл for.

Използване на функцията for Loop и range().

Нека поправим target: стойността, която търсим в списъка.

Можете да използвате функцията for loop и range(), за да получите списъка с индекси от 0 до len(fruits) – 1.

  • Прегледайте списъка с плодове, за да получите достъп до всеки индекс.
  • Проверете дали елементът с текущия индекс i е равен на целта.
  • Ако е True, отпечатайте, че целта е намерена в индекс 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

В този пример целевият низ „манго“ се появява точно веднъж (при индекс 1) в списъка с плодове.

Понякога обаче целевата стойност се появява повече от веднъж или изобщо не се появява. За да се справим с тези случаи, нека модифицираме горния цикл и да обвием съдържанието във функция, наречена find_in_list.

Разбиране на дефиницията на функцията

Функцията find_in_list има два параметъра:

  • target: стойността, която търсите, и
  • py_list: списъкът на Python, в който търсите.
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}")

В тялото на функцията инициализираме празен списък target_indices. Преминаваме през списъка и получаваме достъп до елементите на списъка. Ако целта е намерена при конкретен индекс, ние добавяме този индекс към списъка target_indices с помощта на метода append().

Забележка: В Python list.append(item) добавя елемент в края на списъка.

  • Ако целта никога не бъде намерена, тогава target_indices е празен списък; потребителят се уведомява, че целта не присъства в списъка.
  • Ако целта е намерена в повече от един индекс, тогава target_indices съдържа всички тези индекси.

След това нека предефинираме списъка с плодове, както е показано.

Този път търсим целевия низ „mango“, който се среща два пъти – при индекси 1 и 4.

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

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

При извикване на функцията find_in_list с target и fruits като аргументи виждаме, че се връщат и двата индекса.

target = "turnip"
find_in_list(target,fruits)

# Output
Sorry, target not found!

Ако опитате да търсите „ряпа“, която не присъства в списъка с плодове, получавате съобщение, че целта не е намерена.

  Как да промените паролите на iPhone

Използване на функцията for Loop и enumerate().

В Python можете да използвате функцията enumerate() за достъп както до индекса, така и до елементите едновременно – без да се налага да използвате функцията range().

Следната клетка с код показва как можете да използвате функцията enumerate(), за да получите както индексите, така и елементите.

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

Сега нека пренапишем функцията на Python, за да намерим индекса на елементите в списъка с помощта на функцията 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}")

Както при предишния раздел, сега можете да извикате функцията find_in_list с валидни аргументи.

Можете да преведете горната дефиниция на функция в еквивалентно разбиране на списък и ние ще направим това в следващия раздел.

Намиране на индекс на елемент от списък чрез итерация с помощта на разбиране на списък

Разбирането на списъци в Python ви позволява да създавате списъци от съществуващи списъци въз основа на някакво условие. Ето общата конструкция:

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

Фигурата по-долу описва как да идентифицирате елементите на разбирането на списъка; използвайки това, можете да конвертирате функцията find_in_list в разбиране на списък.

Използвайки горното, изразът за разбиране на списък за създаване на целеви индекси е както следва.

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

Като упражнение можете да опитате да изпълните горния кодов фрагмент за няколко други примера.

Намерете индекс на елемент от списък с помощта на метода index().

За да намерите индекса на елемент в списък на Python, можете също да използвате вградения метод .index(). Ето общия синтаксис:

list.index(value,start,end)

Разбор на горния метод:

  • value е целевата стойност, която търсите.
  • начало и край са незадължителни позиционни аргументи; можете да ги използвате, за да търсите, намирайки индекса на елемент в частта от списъка, започвайки от началото и продължавайки до края – 1.
  Лесен за използване инструмент на ваше разположение

Забележка: Методът .index() връща само индекса на първото появяване на стойност в списъка. Дори когато намерите индекс на елемент в част от списък [start: end-1]този метод връща само индекса, съответстващ на първото срещане на елемента.

Нека преразгледаме нашия пример, за да разберем как работи методът .index().

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

fruits.index(target)
1

Въпреки че има две срещания на „манго“ в списъка с плодове, можете да видите, че е върнат само индексът на първото срещане.

За да получим индекса на второто появяване на манго, можем да търсим през среза на списъка, започвайки от индекс 2 и разширявайки се до индекс 5, както е показано по-долу.

fruits.index(target,2,5)
4

Как да обработваме ValueErrors в Python

Сега нека видим какво се случва, ако се опитате да намерите индекса на елемент, който не присъства в списъка, да речем „морков“.

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

Както се вижда в клетката с код по-горе, това хвърля a ValueError. В Python можете да се справите с това като изключение, като използвате блоковете try и exception.

Общият синтаксис за използване на try-except е както следва.

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

Използвайки горните блокове try-except, можем да обработваме ValueError като изключение.

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

Горният код прави следното:

  • Ако целта присъства в списъка, тя връща индекса на целта.
  • Ако целта не присъства, тя обработва ValueError като изключение и отпечатва съобщението за грешка.

Обобщаване

Ето обобщение на различните методи, които сте научили за намиране на индекса на елемент в списък на Python.

  • Можете да използвате функцията for loop и range() на Python, за да получите елементите и съответните им индекси. Проверете дали елементите в индексите отговарят на целта.
  • Можете също да използвате функцията enumerate() за едновременен достъп до елемента и индекса.
  • Можете да използвате и двата метода по-горе вътре в израз за разбиране на списък.
  • За да намерите индекс на елемент в списък, можете също да използвате вградения метод .index().
  • list.index(стойност) връща индекса на първото появяване на стойност в списъка. Ако стойността не присъства, тя повдига ValueError.
  • Можете да търсите в определен фрагмент от списъка, като използвате list.index(value, start, end), за да търсите срещането на стойност в сегмента на списъка [start:end-1].

След това се научете да сортирате речник на Python по ключ или по стойност. Честито програмиране на Python!