Znajdowanie indeksu elementu podanego listą zawierającą go w Pythonie
Dla listy ["foo", "bar", "baz"]
i elementu na liście "bar"
, Jak uzyskać jej indeks (1) w Pythonie?
27 answers
>>> ["foo", "bar", "baz"].index("bar")
1
Reference: struktury danych > More on Lists
Zastrzeżenia następują
Zauważ, że chociaż jest to chyba najczystszy sposób, aby odpowiedzieć na pytanie , Jak zadano, index
jest raczej słabym składnikiem API list
i nie pamiętam, kiedy ostatni raz używałem go w gniewie. W komentarzach zwrócono mi uwagę, że ponieważ ta odpowiedź jest mocno cytowana, powinna być bardziej kompletna. Niektóre zastrzeżenia o list.index
następują. Prawdopodobnie warto początkowo przyjrzałem się docstringowi:
>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.
Liniowa złożoność czasowa w długości listy
Wywołanie index
sprawdza każdy element listy w kolejności, dopóki nie znajdzie dopasowania. Jeśli Twoja lista jest długa i nie wiesz z grubsza, gdzie na liście występuje, to wyszukiwanie może stać się wąskim gardłem. W takim przypadku należy rozważyć inną strukturę danych. Zauważ, że jeśli wiesz z grubsza, gdzie znaleźć dopasowanie, możesz dać index
podpowiedź. Na przykład w tym fragmencie, l.index(999_999, 999_990, 1_000_000)
jest mniej więcej pięć rzędów wielkości szybciej niż proste l.index(999_999)
, ponieważ pierwszy musi przeszukać tylko 10 wpisów, podczas gdy drugi przeszukuje milion:
>>> import timeit
>>> timeit.timeit('l.index(999_999)', setup='l = list(range(0, 1_000_000))', number=1000)
9.356267921015387
>>> timeit.timeit('l.index(999_999, 999_990, 1_000_000)', setup='l = list(range(0, 1_000_000))', number=1000)
0.0004404920036904514
Zwraca tylko indeks pierwszego dopasowania do jego argumentu
Wywołanie index
przeszukuje listę w kolejności, dopóki nie znajdzie dopasowania, i zatrzymuje się tam. jeśli spodziewasz się, że potrzebujesz indeksów większej liczby dopasowań, powinieneś użyć listy lub generatora ekspresja.
>>> [1, 1].index(1)
0
>>> [i for i, e in enumerate([1, 2, 1]) if e == 1]
[0, 2]
>>> g = (i for i, e in enumerate([1, 2, 1]) if e == 1)
>>> next(g)
0
>>> next(g)
2
Większość miejsc, w których kiedyś użyłbym index
, teraz używam wyrażenia listy lub generatora, ponieważ są one bardziej uogólnialne. Jeśli więc rozważasz sięgnięcie po index
, rzuć okiem na te doskonałe funkcje Pythona.
Rzuca jeśli element nie występuje w liście
Wywołanie doindex
powoduje ValueError
, Jeśli element nie jest obecny.
>>> [1, 1].index(2)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 2 is not in list
Jeśli element może nie być obecny na liście, należy albo
- najpierw sprawdź to za pomocą
item in my_list
(czyste, czytelne podejście) lub - zawiń wywołanie
index
wtry/except
blok, który łapieValueError
(prawdopodobnie szybciej, przynajmniej gdy lista do przeszukania jest długa, a element jest zwykle obecny.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-27 04:00:35
Jedną z rzeczy, która jest naprawdę pomocna w nauce Pythona, jest użycie interaktywnej funkcji pomocy:
>>> help(["foo", "bar", "baz"])
Help on list object:
class list(object)
...
|
| index(...)
| L.index(value, [start, [stop]]) -> integer -- return first index of value
|
Które często prowadzą cię do metody, której szukasz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-07 13:19:56
Większość odpowiedzi wyjaśnia, jak znaleźć pojedynczy indeks , ale ich metody nie zwracają wielu indeksów, jeśli element znajduje się na liście wiele razy. Użycie enumerate()
:
for i, j in enumerate(['foo', 'bar', 'baz']):
if j == 'bar':
print(i)
Funkcja index()
zwraca tylko pierwsze wystąpienie, podczas gdy enumerate()
zwraca wszystkie wystąpienia.
Jako spis treści:
[i for i, j in enumerate(['foo', 'bar', 'baz']) if j == 'bar']
Oto jeszcze jedno małe rozwiązanie z itertools.count()
(które jest prawie takie samo podejście jak "enumerate"): {]}
from itertools import izip as zip, count # izip for maximum efficiency
[i for i, j in zip(count(), ['foo', 'bar', 'baz']) if j == 'bar']
Jest to bardziej efektywne dla większych list niż użycie enumerate()
:
$ python -m timeit -s "from itertools import izip as zip, count" "[i for i, j in zip(count(), ['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 174 usec per loop
$ python -m timeit "[i for i, j in enumerate(['foo', 'bar', 'baz']*500) if j == 'bar']"
10000 loops, best of 3: 196 usec per loop
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 23:55:58
Aby uzyskać wszystkie indeksy:
indexes = [i for i,x in enumerate(xs) if x == 'foo']
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-23 16:43:48
index()
zwraca pierwszy indeks wartości!
| index(...)
| L. index (value, [start, [stop]]) -> integer -- return pierwszy indeks wartości
def all_indices(value, qlist):
indices = []
idx = -1
while True:
try:
idx = qlist.index(value, idx+1)
indices.append(idx)
except ValueError:
break
return indices
all_indices("foo", ["foo","bar","baz","foo"])
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-09 10:38:09
Problem pojawi się, jeśli element nie znajduje się na liście. Ta funkcja rozwiązuje problem:
# if element is found it returns index of element else returns None
def find_element_in_list(element, list_element):
try:
index_element = list_element.index(element)
return index_element
except ValueError:
return None
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-24 10:00:10
a = ["foo","bar","baz",'bar','any','much']
indexes = [index for index in range(len(a)) if a[index] == 'bar']
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-31 07:45:46
Musisz ustawić warunek, aby sprawdzić, czy element, którego szukasz, znajduje się na liście
if 'your_element' in mylist:
print mylist.index('your_element')
else:
print None
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-26 04:26:52
Wszystkie proponowane tutaj funkcje odtwarzają nieodłączne zachowania językowe, ale zaciemniają, co się dzieje.
[i for i in range(len(mylist)) if mylist[i]==myterm] # get the indices
[each for each in mylist if each==myterm] # get the items
mylist.index(myterm) if myterm in mylist else None # get the first index and fail quietly
Po co pisać funkcję z obsługą WYJĄTKÓW, jeśli język sam zapewnia metody do tego, co chcesz?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-24 14:24:33
Jeśli chcesz wszystkie indeksy, możesz użyć NumPy :
import numpy as np
array = [1, 2, 1, 3, 4, 5, 1]
item = 1
np_array = np.array(array)
item_index = np.where(np_array==item)
print item_index
# Out: (array([0, 2, 6], dtype=int64),)
Jest to jasne, czytelne rozwiązanie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:26:33
Oczywiście, istnieje metoda index, która zwraca indeks pierwszego wystąpienia:]}Znalezienie indeksu elementu podanego listy zawierającej go w Pythonie
Dla listy
["foo", "bar", "baz"]
i elementu na liście"bar"
, jaki jest najczystszy sposób na uzyskanie indeksu (1) w Pythonie?
>>> l = ["foo", "bar", "baz"]
>>> l.index('bar')
1
Istnieje kilka problemów z tą metodą:
- jeśli wartość nie znajduje się na liście, otrzymasz
ValueError
- jeśli więcej niż jedna z wartości jest na liście znajdziesz indeks tylko dla pierwszego
Brak wartości
Jeśli wartość może brakować, musisz złapać ValueError
.
Możesz to zrobić za pomocą definicji wielokrotnego użytku, takiej jak ta:
def index(a_list, value):
try:
return a_list.index(value)
except ValueError:
return None
I użyj go tak:
>>> print(index(l, 'quux'))
None
>>> print(index(l, 'bar'))
1
A minusem tego jest to, że prawdopodobnie będziesz miał sprawdzanie, czy zwrócona wartość is
lub is not
None:
result = index(a_list, value)
if result is not None:
do_something(result)
Więcej niż jedna wartość na liście
Jeśli mógłbyś mieć więcej zdarzeń, będziesz Nie uzyskać pełne informacje z list.index
:
>>> l.append('bar')
>>> l
['foo', 'bar', 'baz', 'bar']
>>> l.index('bar') # nothing at index 3?
1
Możesz wyliczyć do listy indeksy:
>>> [index for index, v in enumerate(l) if v == 'bar']
[1, 3]
>>> [index for index, v in enumerate(l) if v == 'boink']
[]
Jeśli nie masz żadnych wystąpień, możesz to sprawdzić za pomocą boolean check wyniku, lub po prostu nie rób nic, jeśli zapętlisz wyniki:
indexes = [index for index, v in enumerate(l) if v == 'boink']
for index in indexes:
do_something(index)
Lepsze dane z pand
Jeśli masz pandy, możesz łatwo uzyskać te informacje za pomocą obiektu szeregowego:
>>> import pandas as pd
>>> series = pd.Series(l)
>>> series
0 foo
1 bar
2 baz
3 bar
dtype: object
Kontrola porównawcza zwróci serię of booleans:
>>> series == 'bar'
0 False
1 True
2 False
3 True
dtype: bool
Przekaż tę serię booleanów do serii za pomocą notacji dolnej, a otrzymasz tylko pasujące elementy:
>>> series[series == 'bar']
1 bar
3 bar
dtype: object
Jeśli chcesz tylko indeksy, atrybut index zwraca serię liczb całkowitych:
>>> series[series == 'bar'].index
Int64Index([1, 3], dtype='int64')
I jeśli chcesz je umieścić w liście lub krotce, po prostu przekaż je do konstruktora:
>>> list(series[series == 'bar'].index)
[1, 3]
Tak, przydałaby się też lista z enumerate, ale to nie jest tak eleganckie, moim zdaniem-robisz testy na równość w Pythonie, zamiast pozwalać wbudowanemu kodowi napisanemu w C, zajmijcie się nim:
>>> [i for i, value in enumerate(l) if value == 'bar']
[1, 3]
Czy to problem XY?
Problem XY polega na pytaniu o próbę rozwiązania, a nie o faktyczny problem.
Dlaczego uważasz, że potrzebujesz indeksu podanego jako element listy?
Jeśli znasz już wartość, dlaczego obchodzi cię, gdzie jest ona na liście?
Jeśli nie ma wartości, łapanie ValueError
jest raczej gadatliwe - i wolę unikaj tego.
Zazwyczaj iteruję nad listą, więc zazwyczaj zachowam wskaźnik do interesujących informacji, uzyskując indeks z enumerate.
Jeśli gromadzisz dane, prawdopodobnie powinieneś używać pand-które mają o wiele bardziej eleganckie narzędzia niż czyste obejścia w Pythonie, które pokazałem.
Nie przypominam sobie, żebym potrzebował. Jednak przejrzałem standardową bibliotekę Pythona i widzę kilka doskonałych zastosowań.Jest wiele, wiele zastosowań dla niego w idlelib
, do analizy GUI i tekstu.
Moduł keyword
używa go do znajdowania znaczników komentarzy w module, aby automatycznie regenerować listę słów kluczowych w nim za pomocą metaprogramowania.
W Lib/mailbox.py wygląda na to, że używa go jak uporządkowanego mapowania: {]}
key_list[key_list.index(old)] = new
I
del key_list[key_list.index(key)]
W Lib/http/cookiejar.py, wydaje się być używany do zdobycia następnego miesiąca:
mon = MONTHS_LOWER.index(mon.lower())+1
W Lib/tarfile.py podobne do distutils, aby uzyskać pokrój do elementu:
members = members[:members.index(tarinfo)]
W Lib/pickletools.py:
numtopop = before.index(markobject)
To, co te zwyczaje wydają się mieć wspólnego jest to, że wydają się działać na listach ograniczonych rozmiarów (ważne ze względu na O(n) lookup time for list.index
), i są one używane głównie w parsingu (i UI w przypadku Idle).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-02 23:56:20
Wszystkie indeksy z zip
Funkcja:
get_indexes = lambda x, xs: [i for (y, i) in zip(xs, range(len(xs))) if x == y]
print get_indexes(2, [1, 2, 3, 4, 5, 6, 3, 2, 3, 2])
print get_indexes('f', 'xsfhhttytffsafweef')
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:50:20
Po prostu możesz wybrać
a = [['hand', 'head'], ['phone', 'wallet'], ['lost', 'stock']]
b = ['phone', 'lost']
res = [[x[0] for x in a].index(y) for y in b]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-29 07:17:15
Inna opcja
>>> a = ['red', 'blue', 'green', 'red']
>>> b = 'red'
>>> offset = 0;
>>> indices = list()
>>> for i in range(a.count(b)):
... indices.append(a.index(b,offset))
... offset = indices[-1]+1
...
>>> indices
[0, 3]
>>>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-29 19:17:21
Wariant odpowiedzi z FMc i user7177 da dict, który może zwrócić wszystkie indeksy dla dowolnego wpisu:
>>> a = ['foo','bar','baz','bar','any', 'foo', 'much']
>>> l = dict(zip(set(a), map(lambda y: [i for i,z in enumerate(a) if z is y ], set(a))))
>>> l['foo']
[0, 5]
>>> l ['much']
[6]
>>> l
{'baz': [2], 'foo': [0, 5], 'bar': [1, 3], 'any': [4], 'much': [6]}
>>>
Możesz również użyć tego jako jednego linera, aby uzyskać wszystkie indeksy dla jednego wpisu. Nie ma gwarancji skuteczności, chociaż użyłem set(a), aby zmniejszyć liczbę wywołań lambda.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-28 09:11:57
A teraz coś zupełnie innego...
... na przykład potwierdzenie istnienia elementu przed uzyskaniem indeksu. Zaletą tego podejścia jest to, że funkcja zawsze zwraca listę indeksów - nawet jeśli jest to pusta lista. Działa również ze strunami.
def indices(l, val):
"""Always returns a list containing the indices of val in the_list"""
retval = []
last = 0
while val in l[last:]:
i = l[last:].index(val)
retval.append(last + i)
last += i + 1
return retval
l = ['bar','foo','bar','baz','bar','bar']
q = 'bar'
print indices(l,q)
print indices(l,'bat')
print indices('abcdaababb','a')
Po wklejeniu do interaktywnego okna Pythona:
Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def indices(the_list, val):
... """Always returns a list containing the indices of val in the_list"""
... retval = []
... last = 0
... while val in the_list[last:]:
... i = the_list[last:].index(val)
... retval.append(last + i)
... last += i + 1
... return retval
...
>>> l = ['bar','foo','bar','baz','bar','bar']
>>> q = 'bar'
>>> print indices(l,q)
[0, 2, 4, 5]
>>> print indices(l,'bat')
[]
>>> print indices('abcdaababb','a')
[0, 4, 5, 7]
>>>
Update
Po kolejnym roku rozwoju Pythona heads-down, jestem trochę zażenowany moją oryginalną odpowiedzią, więc aby ustawić zapis prosty, z pewnością można użyć powyższego kodu; jednak znacznie bardziej idiomatycznym sposobem uzyskania tego samego zachowania byłoby użycie rozumienia list, wraz z funkcją enumerate ().
Coś takiego:
def indices(l, val):
"""Always returns a list containing the indices of val in the_list"""
return [index for index, value in enumerate(l) if value == val]
l = ['bar','foo','bar','baz','bar','bar']
q = 'bar'
print indices(l,q)
print indices(l,'bat')
print indices('abcdaababb','a')
Które po wklejeniu do interaktywnego okna Pythona daje:
Python 2.7.14 |Anaconda, Inc.| (default, Dec 7 2017, 11:07:58)
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def indices(l, val):
... """Always returns a list containing the indices of val in the_list"""
... return [index for index, value in enumerate(l) if value == val]
...
>>> l = ['bar','foo','bar','baz','bar','bar']
>>> q = 'bar'
>>> print indices(l,q)
[0, 2, 4, 5]
>>> print indices(l,'bat')
[]
>>> print indices('abcdaababb','a')
[0, 4, 5, 7]
>>>
A teraz, po przejrzeniu tego pytania i wszystkich odpowiedzi, zdaję sobie sprawę, że to jest dokładnie to, co FMC zasugerował w swojej wcześniejszej odpowiedzi . Kiedy odpowiedziałem na to pytanie, nawet nie widziałem tej odpowiedzi, ponieważ jej nie rozumiałem. Mam nadzieję, że mój nieco bardziej gadatliwy przykład pomoże zrozumieć.
Jeśli pojedyncza linijka kodu powyżej nadal nie ma sensu dla Ciebie, Gorąco polecam Ci Google "Python list comprehension" i poświęć kilka minut na zapoznanie się. To tylko jedna z wielu zaawansowanych funkcji, które sprawiają, że korzystanie z Pythona do tworzenia kodu jest przyjemnością.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-18 10:01:05
Uzyskanie wszystkich wystąpień i pozycji jednego lub więcej (identycznych) elementów na liście
Za pomocą enumerate (alist) możesz zapisać pierwszy element (n), który jest indeksem listy, gdy element x jest równy temu, czego szukasz.
>>> alist = ['foo', 'spam', 'egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>
Niech nasza funkcja findindex
Ta funkcja przyjmuje element i listę jako argumenty i zwraca pozycję elementu na liście, tak jak widzieliśmy wcześniej.
def indexlist(item2find, list_or_string):
"Returns all indexes of an item in a list or a string"
return [n for n,item in enumerate(list_or_string) if item==item2find]
print(indexlist("1", "010101010"))
Wyjście
[1, 3, 5, 7]
Proste
for n, i in enumerate([1, 2, 3, 4, 1]):
if i == 1:
print(n)
Wyjście:
0
4
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:28:43
To rozwiązanie nie jest tak potężne jak inne, ale jeśli jesteś początkujący i znasz tylko pętle for
, nadal możesz znaleźć pierwszy indeks elementu, unikając ValueError:
def find_element(p,t):
i = 0
for e in p:
if e == t:
return i
else:
i +=1
return -1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-12 06:07:52
name ="bar"
list = [["foo", 1], ["bar", 2], ["baz", 3]]
new_list=[]
for item in list:
new_list.append(item[0])
print(new_list)
try:
location= new_list.index(name)
except:
location=-1
print (location)
Oznacza to, że jeśli łańcuch nie znajduje się na liście, jeśli nie znajduje się na liście, to location = -1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-05 13:12:19
Ponieważ listy Pythona są oparte na 0, możemy użyć wbudowanej funkcji zip w następujący sposób:
>>> [i for i,j in zip(range(len(haystack)), haystack) if j == 'needle' ]
Gdzie "stóg siana" to lista, o której mowa, a "igła" to przedmiot, którego należy szukać.
(Uwaga: tutaj iterujemy używając i, aby uzyskać indeksy, ale jeśli chcemy skupić się na elementach, możemy przełączyć się na j.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:56:33
Istnieje bardziej funkcjonalna odpowiedź na to pytanie.
list(filter(lambda x: x[1]=="bar",enumerate(["foo", "bar", "baz", "bar", "baz", "bar", "a", "b", "c"])))
Bardziej ogólna forma:
def get_index_of(lst, element):
return list(map(lambda x: x[0],\
(list(filter(lambda x: x[1]==element, enumerate(lst))))))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:53:01
Metoda Python index()
wyświetla błąd, jeśli element nie został znaleziony, co jest do bani!
Więc zamiast tego możesz uczynić go podobnym do indexOf()
funkcji JavaScript, która zwraca -1
Jeśli element nie został znaleziony:
try:
index = array.index('search_keyword')
except ValueError:
index = -1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:53:55
Znalezienie indeksu pozycji x na liście L :
idx = L.index(x) if (x in L) else -1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-31 22:46:51
Dla tych, którzy pochodzą z innego języka jak ja, może dzięki prostej pętli łatwiej jest go zrozumieć i używać:
mylist = ["foo", "bar", "baz", "bar"]
newlist = enumerate(mylist)
for index, item in newlist:
if item == "bar":
print(index, item)
Jestem wdzięczny za co dokładnie robi enumerate?. To pomogło mi zrozumieć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-04 20:55:15
Jeśli wydajność jest niepokojąca:
W licznych odpowiedziach mówi się, że wbudowana metoda metody {[2] } jest algorytmem O (n). To jest w porządku, jeśli trzeba wykonać to raz. Ale jeśli chcesz uzyskać dostęp do indeksów elementów kilka razy, bardziej sensowne jest najpierw utworzenie słownika(O(n)) par element-indeks, a następnie dostęp do indeksu w O (1) za każdym razem, gdy go potrzebujesz.
Jeśli masz pewność, że pozycje na liście nigdy się nie powtórzą, możesz łatwo:
myList = ["foo", "bar", "baz"]
# Create the dictionary
myDict = dict((e,i) for i,e in enumerate(myList))
# Lookup
myDict["bar"] # Returns 1
# myDict.get("blah") if you don't want an error to be raised if element not found.
Jeśli możesz mieć zduplikowane elementy i musisz zwrócić wszystkie ich indeksy:
from collections import defaultdict as dd
myList = ["foo", "bar", "bar", "baz", "foo"]
# Create the dictionary
myDict = dd(list)
for i,e in enumerate(myList):
myDict[e].append(i)
# Lookup
myDict["foo"] # Returns [0, 4]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-10 18:51:04
Są dwie możliwości, jeśli lista nie zawiera powtarzających się elementów, które należy sprawdzić w indeksie
eg: li=[10,20,30] # here need to get index of 20 means
li.index(20) # will work properly because 20 is not repeated
Jeśli jego powtórzenie oznacza, że da Ci tylko pierwszy indeks
Jeśli chcesz uzyskać cały indeks, w którym element jest obecny oznacza
eg: li=[10,20,30,20,40, 50, 10] # here need to get index of 20 means its have 2 index (1,3)
Aby to osiągnąć musisz to zrobić jak
li=[10,20,30,20,40, 50, 10]
[i for i, e in enumerate(li) if e == 20]
Następnie otrzymasz listę indeksu jako o / p jak [1,3]
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-04 05:26:17
Jak wskazał @TerryA, wiele odpowiedzi mówi o tym, jak znaleźć Jeden indeks.
more_itertools
jest biblioteką innej firmy z narzędziami do lokalizowania wielu indeksów wewnątrz iterowalnego.
Given
import more_itertools as mit
iterable = ["foo", "bar", "baz", "ham", "foo", "bar", "baz"]
Kod
Znajdź wskaźniki wielu obserwacji:
list(mit.locate(iterable, lambda x: x == "bar"))
# [1, 5]
Przetestuj wiele elementów:
list(mit.locate(iterable, lambda x: x in {"bar", "ham"}))
# [1, 3, 5]
Zobacz także więcej opcji z more_itertools.locate
. Install via > pip install more_itertools
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-25 15:47:56