Як знайсці індэкс элемента ў спісах 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 і гэтак далей. Калі даўжыня iterable роўная 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, давайце даведаемся, як знайсці індэкс элемента ў спісе.

Знайсці індэкс элемента спіса шляхам ітэрацыі з выкарыстаннем цыклаў for

Разгледзім спіс садавіны з папярэдняга раздзела. Мы даведаемся, як знайсці індэкс пэўнага элемента ў гэтым спісе шляхам ітэрацыі з дапамогай цыкла for.

Праверце гэта:  Як ачысціць даныя аўтазапаўнення ў Chrome

Выкарыстанне функцыі 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!

Калі вы паспрабуеце пашукаць «рэпу», якой няма ў спісе садавіны, вы атрымаеце паведамленне, што мэта не знойдзена.

Праверце гэта:  Як выкарыстоўваць сапраўдны кантролер GameCube або Wiimote ў Dolphin

Выкарыстанне функцыі цыкла for і 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)

Разбор вышэйзгаданага метаду:

  • значэнне – мэтавае значэнне, якое вы шукаеце.
  • пачатак і канец неабавязковыя пазіцыйныя аргументы; вы можаце выкарыстоўваць іх для пошуку, каб знайсці індэкс элемента ў спісе, пачынаючы з пачатку і да канца – 1.

Заўвага: метад .index() вяртае толькі індэкс першага ўваходжання значэння ў спісе. Нават калі вы знойдзеце індэкс элемента ў спісе [start: end-1]гэты метад вяртае толькі індэкс, які адпавядае першаму ўваходжанню элемента.

Праверце гэта:  15 лепшых інструментаў для маніторынгу сеткі, якія выпрабоўваюцца ў 2020 годзе

Давайце вернемся да нашага прыкладу, каб зразумець, як працуе метад .index().

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

fruits.index(target)
1

Нягледзячы на ​​тое, што ў спісе садавіны ёсць два ўваходжання “манга”, вы бачыце, што вернуты толькі індэкс першага ўваходжання.

Каб атрымаць індэкс другога ўваходжання слова mango, мы можам правесці пошук па зрэзе спісу, пачынаючы з індэксу 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 і акрамя.

Агульны сінтаксіс выкарыстання 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.

  • Вы можаце выкарыстоўваць функцыю Python for loop і range(), каб атрымаць элементы і іх адпаведныя індэксы. Праверце, ці адпавядаюць элементы ў індэксах мэты.
  • Вы таксама можаце выкарыстоўваць функцыю enumerate() для адначасовага доступу да элемента і індэкса.
  • Вы можаце выкарыстоўваць абодва вышэйпералічаныя метады ўнутры выразу разумення спісу.
  • Каб знайсці індэкс элемента ў спісе, вы таксама можаце выкарыстоўваць убудаваны метад .index().
  • list.index(value) вяртае індэкс першага ўваходжання значэння ў спіс. Калі значэнне адсутнічае, яно выклікае ValueError.
  • Вы можаце шукаць пэўны фрагмент спісу з дапамогай list.index(value, start, end) для пошуку значэнняў у спісе. [start:end-1].

Далей навучыцеся сартаваць слоўнік Python па ключы або па значэнні. Шчаслівага праграмавання на Python!