Biorąc pod uwagę listę ["foo", "bar", "baz"] i element na liście "bar", jak mogę uzyskać indeks (1) w Pythonie?

3854
Eugene M 7 październik 2008, 05:39

29 odpowiedzi

Najlepsza odpowiedź
>>> ["foo", "bar", "baz"].index("bar")
1

Odniesienie: struktury danych & GT; Więcej na liście

Powiedź śledzi

Należy pamiętać, że gdy jest to chyba najczystszy sposób na odpowiedź na pytanie , jak zapytano , index jest raczej słabym składnikiem API list i nie pamiętam ostatniego Czas użyłem go w gniewie. Wskazano mi w komentarzach, ponieważ dlatego, że ta odpowiedź jest mocno przywoływana, powinna być dokonana bardziej kompletna. Śledź kilka zastrzeżeń o list.index. Prawdopodobnie warto początkowo spojrzeć na dokumentację:

list.index(x[, start[, end]])

Zwróć indeks zerowy na liście pierwszego elementu, którego wartość jest równa x . Podnosi ValueError Jeśli nie ma takiego elementu.

Opcjonalne argumenty Start i End są interpretowane jako w Notacja z plasterkiem i są używane do ograniczenia wyszukiwania do określonego poddziałania listy. Zwrócony indeks jest obliczany w stosunku do początku pełnej sekwencji, a nie argumentu startowego.

Liniowa złożoność na liście

Wywołanie index sprawdza każdy element listy w kolejności, aż znajdzie dopasowanie. Jeśli twoja lista jest długi, a ty nie wiesz mniej więcej, gdzie na liście wystąpi, to wyszukiwanie może stać się gardłem. W takim przypadku należy rozważyć inną strukturę danych. Należy pamiętać, że jeśli znasz mniej więcej Gdzie znaleźć mecz, możesz dać index Wskazówka. Na przykład, w tym fragment, l.index(999_999, 999_990, 1_000_000) jest mniej więcej pięć rzędów wielkości szybciej niż prosta l.index(999_999), ponieważ pierwsza musi wyszukiwać 10 wpisów, podczas gdy te ostatnie 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 wskaźnik pierwszego meczu do jego argumentu

Połączenie do index przeszukuje listę, dopóki nie znajdzie mecz, a zatrzymuje się tam. Jeśli spodziewasz się potrzebować wskaźników więcej meczów, powinieneś użyć rozumienia listy lub generator wyrażenie.

>>> [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 rozumienia lub generatora, ponieważ są bardziej uogólnione. Więc jeśli rozważasz się do index, spójrz na te doskonałe funkcje Pythona.

Rzuca, jeśli element nie jest obecny na liście

Wezwanie do index wyniki w ValueError Jeśli przedmiot 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 przedmiot może nie być obecny na liście, powinieneś albo

  1. Najpierw sprawdź go z item in my_list (czyste, czytelne podejście) lub
  2. Wrap index blok w bloku try/except, który przyciąga ValueError (prawdopodobnie szybciej, przynajmniej gdy lista do wyszukiwania jest długi, a przedmiot jest zwykle obecny.)
4892
Community 20 czerwiec 2020, 09:12

Aby zapobiec ValueError, możesz dokonać funkcji, aby to zrobić, chociaż również zajęła klasa.

def findInList(List, item):
   try:
      return List.index(item)
   except ValueError:
      return -1

Jedynym problemem jest to, że może spowodować trudne do śledzenia błędu; To samo dotyczyłoby innych liczb.
Jeśli jednak zwróci coś innego niż liczbę, prawdopodobnie zostanie użyty jako indeks listy i nieuchronnie rzuci błąd w każdym razie.

Moim zdaniem, zakładając, że coś poszło nie tak, jeśli przedmiot nie zostanie znaleziony, lepiej jest używać {X1}} - {X1}} - Nie będzie też wartości zwrotu:

# python 3.x

class itemNotFoundInListError(Exception): 
    pass

def findInList(List, item):
   try:
      return List.index(item)
   except ValueError:
      raise itemNotFoundInListError(f"List `{List}` does not contain `{item}.`")
1
Sapphire_Brick 29 październik 2019, 22:27

Używanie słownika, gdzie najpierw przetwarzaj listę, a następnie dodaj indeks do niego

from collections import defaultdict

index_dict = defaultdict(list)    
word_list =  ['foo','bar','baz','bar','any', 'foo', 'much']

for word_index in range(len(word_list)) :
    index_dict[word_list[word_index]].append(word_index)

word_index_to_find = 'foo'       
print(index_dict[word_index_to_find])

# output :  [0, 5]
0
sahasrara62 18 marzec 2019, 09:32

Jedną rzeczą, która jest naprawdę pomocna w nauce Pythona, jest korzystanie z 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óry często poprowadzi do metody, której szukasz.

927
davidavr 7 październik 2008, 13:19

Większość odpowiedzi wyjaśnia, jak znaleźć pojedynczego indeksu , ale ich metody nie zwracają wielu indeksów, jeśli element znajduje się na liście wielokrotnie. Użyj itertools.count() (który jest prawie takie samo podejście jak wyliczanie):

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 wydajne dla większych list niż przy użyciu 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
601
Boris 21 styczeń 2020, 13:04

Aby uzyskać wszystkie indeksy:

indexes = [i for i,x in enumerate(xs) if x == 'foo']
193
Arkistarvh Kltzuonstev 30 lipiec 2019, 11:17

index() Zwraca pierwszy wskaźnik wartości!

|. Indeks (...)
|. L.index (wartość, [Start, [Stop]) - & GT; Integer - Powrót 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"])
138
HongboZhu 9 marzec 2012, 10:38

Problem pojawi się, jeśli element nie znajduje się na liście. Ta funkcja obsługuje 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
90
tanzil 24 kwiecień 2017, 10:00
a = ["foo","bar","baz",'bar','any','much']

indexes = [index for index in range(len(a)) if a[index] == 'bar']
84
savinson 31 październik 2017, 07:45

Musisz ustawić warunek do sprawdzenia, czy element, którego szukasz, znajduje się na liście

if 'your_element' in mylist:
    print mylist.index('your_element')
else:
    print None
60
user3670684 26 maj 2014, 04:26

Wszystkie proponowane funkcje reprodukuje nieodłączne zachowanie językowe, ale niejasne, 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 napisać funkcję z obsługą wyjątkiem, jeśli język zapewnia sposoby robienia tego, czego chcesz?

45
Peter Badida 24 grudzień 2016, 14:24

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 jasne, czytelne rozwiązanie.

45
Peter Mortensen 4 czerwiec 2018, 20:26

Znalezienie indeksu elementu podanego na liście zawierającej go w Pythonie

Aby uzyskać listę ["foo", "bar", "baz"] i przedmiot na liście "bar", jaka jest najczystszy sposób na uzyskanie indeksu (1) w Pythonie?

Cóż, na pewno jest metoda indeksu, która zwraca indeks pierwszego zdarzenia:

>>> l = ["foo", "bar", "baz"]
>>> l.index('bar')
1

Istnieje kilka problemów z tą metodą:

  • Jeśli wartość nie jest na liście, otrzymasz ValueError
  • Jeśli na liście znajduje się więcej niż jedna z wartości, otrzymasz indeks dla pierwszego

Brak wartości

Jeśli można było brakować wartości, musisz złapać ValueError.

Możesz to zrobić z taką definicją wielokrotnego użytku:

def index(a_list, value):
    try:
        return a_list.index(value)
    except ValueError:
        return None

I użyj tego w ten sposób:

>>> print(index(l, 'quux'))
None
>>> print(index(l, 'bar'))
1

I wadą tego jest to, że prawdopodobnie będziesz miał sprawdzić, czy zwrócona wartość is lub is not Brak:

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ń, nie Uzyskaj pełne informacje za pomocą list.index:

>>> l.append('bar')
>>> l
['foo', 'bar', 'baz', 'bar']
>>> l.index('bar')              # nothing at index 3?
1

Możesz wyliczyć do listy zrozumieć 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 zdarzeń, możesz sprawdzić, czy z kontrolą boolowskiego lub po prostu nic nie rób, jeśli pętla się nad wynikami:

indexes = [index for index, v in enumerate(l) if v == 'boink']
for index in indexes:
    do_something(index)

Lepsze dane danych z pandy

Jeśli masz Pandas, możesz łatwo uzyskać informacje z obiektem serii:

>>> import pandas as pd
>>> series = pd.Series(l)
>>> series
0    foo
1    bar
2    baz
3    bar
dtype: object

Kontrola porównania zwróci serię Booleans:

>>> series == 'bar'
0    False
1     True
2    False
3     True
dtype: bool

Podaj tę serię Booleanów do serii za pośrednictwem notacji indeksu, a otrzymasz tylko pasujące elementy:

>>> series[series == 'bar']
1    bar
3    bar
dtype: object

Jeśli chcesz tylko indeksy, atrybut indeksu zwraca szereg liczb całkowitych:

>>> series[series == 'bar'].index
Int64Index([1, 3], dtype='int64')

A jeśli chcesz je na liście lub krotkach, przekaż je do konstruktora:

>>> list(series[series == 'bar'].index)
[1, 3]

Tak, można też użyć rozumienia listy z wyliczonymi, ale to nie tak elegancko, moim zdaniem - robisz testy na rzecz równości w Pythonie, zamiast pozwolić wbudowanym kodem napisanym w C.

>>> [i for i, value in enumerate(l) if value == 'bar']
[1, 3]

Czy to jest Problem XY?

Problem XY pyta o rozwiązanie próbne, a nie rzeczywisty problem.

Jak myślisz, dlaczego potrzebujesz indeksu, biorąc pod uwagę element na liście?

Jeśli już znasz wartość, dlaczego obchodzi cię tam, gdzie znajduje się na liście?

Jeśli wartość nie jest tam, przyciągając ValueError jest raczej pełni - i wolę tego uniknąć.

I tak zwykle i tak ważne na liście, więc zazwyczaj zachowam wskaźnik do innych informacji, uzyskania indeks z wyliczonym. .

Jeśli jesteśmy danymi, powinieneś być używany Pandas - który ma znacznie bardziej eleganckie narzędzia niż czyste obejścia Pythona, jakie pokazałem.

Nie pamiętam, że nie potrzebuję list.index, sam. Przeglądałem jednak przez bibliotekę standardową Pythona i widzę dla niego doskonałe zastosowania.

Jest wiele, wielu zastosowań do tego w idlelib, dla parsowania GUI i tekstu.

Moduł keyword używa go do znalezienia znaczników komentarzy w module, aby automatycznie regenerować listę słów kluczowych w niej przez Metaprogramming.

W lib / skrzynce pocztowej. Zdaje się go używać jak zamówiony mapowanie:

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 uzyskania następnego miesiąca:

mon = MONTHS_LOWER.index(mon.lower())+1

W lib / tarfile.py podobne do dystrybucji, aby uzyskać kawałek do elementu:

members = members[:members.index(tarinfo)]

W lib / Pickletools.py:

numtopop = before.index(markobject)

To, co wydają się być wspólne, jest to, że wydają się działać na listach ograniczonych rozmiarów (ważnych z powodu o (n) czasu wyszukiwania dla list.index) i są głównie używane w analizie (i ui w przypadek bezczynności).

Chociaż są dla niego korzystanie z nich, są dość niezbyt często. Jeśli uważasz, że szukasz tej odpowiedzi, zadaj sobie pytanie, czy to, co robisz, jest najbardziej bezpośrednie wykorzystanie narzędzi dostarczanych przez język dla Twojego przypadku.

41
Community 20 czerwiec 2020, 09:12

Uzyskiwanie wszystkich zdarzeń i pozycję jednego lub więcej (identycznych) elementów na liście

Z wyliczonym (alistem) można przechowywać 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]
>>>

Zróbmy naszą funkcję Findindex

Ta funkcja ma przedmiot i listę jako argumenty i zwróć pozycję elementu na liście, jak wcześniej widzieliśmy.

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]

Prosty

for n, i in enumerate([1, 2, 3, 4, 1]):
    if i == 1:
        print(n)

Wynik:

0
4
23
Sociopath 5 listopad 2018, 12:18

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')
22
Peter Mortensen 4 czerwiec 2018, 20:50

Po prostu możesz iść

a = [['hand', 'head'], ['phone', 'wallet'], ['lost', 'stock']]
b = ['phone', 'lost']

res = [[x[0] for x in a].index(y) for y in b]
18
kiriloff 29 maj 2013, 07:17

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]
>>> 
17
Mathitis2Software 29 maj 2013, 19:17

A teraz coś z zupełnie innej beczki...

... jak potwierdzenie istnienia przedmiotu przed uzyskaniem indeksu. Nicea o tym podejściu jest funkcja zawsze zwraca listę indeksów - nawet jeśli jest pustą listą. Działa również z ciągami.

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 wklejonym 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]
>>> 

Aktualizacja

Po kolejnym roku rozwoju Pythona Heads-Down, jestem trochę zawstydzony moim pierwotną odpowiedzią, więc aby ustawić rekord prosty, z pewnością można korzystać z powyższego kodu; Jednakże jest bardziej idiomatyczny sposób, aby uzyskać takie samo zachowanie, aby użyć rozumienia listy, wraz z funkcją wyliczania ().

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óry, wklejony do interaktywnego dokumentów okiennych Pythona:

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 dokonaniu przeglądu tego pytania i wszystkich odpowiedzi, zdaję sobie sprawę, że jest to dokładnie to, co jest dokładnie co FMC sugerowane w jego Wcześniejsza odpowiedź . W tym czasie pierwotnie odpowiedziałem na to pytanie, nawet nie patrz , ponieważ tego nie rozumiałem. Mam nadzieję, że mój nieco bardziej podawany przykład pomoże zrozumieć.

Jeśli pojedyncza linia kodu powyżej nadal nie ma sensu, bardzo polecam Cię, bardzo polecam, aby zapoznać się z listami Python "Google" i potrwa kilka minut. To tylko jedna z wielu potężnych funkcji, które sprawiają, że radość używa Pythona do opracowania kodu.

15
MrWonderful 18 lipiec 2018, 10:01

Wariant na temat odpowiedzi FMC i User7177 da dykt, który może zwrócić wszystkie indeksy dla każdego 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 wkładki, aby uzyskać wszystkie indeksy na pojedynczy wpis. Nie ma gwarancji na wydajność, chociaż użyłem zestawu (a), aby zmniejszyć liczbę razy Lambda nazywa się.

13
bvanlew 28 marzec 2014, 09:11

Znalezienie indeksu elementu X na liście L:

idx = L.index(x) if (x in L) else -1
11
Ketan 30 styczeń 2019, 17:36

To rozwiązanie nie jest tak samo potężne jak inne, ale jeśli jesteś początkującym i wiem tylko o for pętle, nadal można znaleźć pierwszego indeksu elementu, unikając programu ValueError:

def find_element(p,t):
    i = 0
    for e in p:
        if e == t:
            return i
        else:
            i +=1
    return -1
10
totallyhuman 12 listopad 2017, 06:07
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)

To konta, jeśli ciąg nie znajduje się również na liście, jeśli nie jest na liście, a następnie location = -1

6
Sociopath 13 luty 2020, 13:06

Metoda Python {X0}} rzuca błąd, jeśli przedmiot nie został znaleziony. Więc zamiast tego możesz zrobić podobnie do funkcji JavaScript indexOf(), który zwraca -1 Jeśli przedmiot nie został znaleziony:

try:
    index = array.index('search_keyword')
except ValueError:
    index = -1
5
Arkistarvh Kltzuonstev 30 lipiec 2019, 11:19

Ponieważ listy Python są oparte na zero, 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 "Haystack" jest wymienioną listą, a "igła" jest przedmiotem poszukiwania.

(UWAGA: Tutaj jest to, że używamy, aby uzyskać indeksy, ale jeśli będziemy potrzebować, aby skupić się na elementach, możemy przełączyć się na jot.)

4
Peter Mortensen 4 czerwiec 2018, 20:56

Istnieje bardziej funkcjonalna odpowiedź na to.

list(filter(lambda x: x[1]=="bar",enumerate(["foo", "bar", "baz", "bar", "baz", "bar", "a", "b", "c"])))

Więcej formularza ogólnego:

def get_index_of(lst, element):
    return list(map(lambda x: x[0],\
       (list(filter(lambda x: x[1]==element, enumerate(lst))))))
3
Peter Mortensen 4 czerwiec 2018, 20:53

Dla tych, którzy pochodzą z innego języka jak ja, może z prostą pętlę, łatwiej jest zrozumieć i używać go:

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 wylicza? . To pomogło mi zrozumieć.

2
Peter Mortensen 4 czerwiec 2018, 20:55

Podajmy nazwę lst na listę, którą masz. Można konwertować listę lst do numpy array. A następnie użyj numpy.where Aby uzyskać indeks wybranego elementu na liście. Poniżej znajduje się sposób, w jaki go wdrojesz.

import numpy as np

lst = ["foo", "bar", "baz"]  #lst: : 'list' data type
print np.where( np.array(lst) == 'bar')[0][0]

>>> 1
2
Siddharth Satpathy 28 listopad 2018, 06:42

Jeśli wydajność jest problemu:

Jest wspomniany w wielu odpowiedziach, że wbudowany sposób metody list.index(item) jest algorytmem O (N). W porządku, jeśli trzeba to wykonać raz. Ale jeśli musisz uzyskać dostęp do indeksów elementów, wiele razy wiele razy, ma więcej sensu, aby najpierw utworzyć słownik (O (n)) parami past wskaźników, a następnie uzyskać dostęp do indeksu w O (1) za każdym razem, gdy potrzebujesz to.

Jeśli jesteś pewien, że elementy na liście nigdy nie są powtarzane, 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ć duplikaty elementów i trzeba zwrócić wszystkie ich wskaźniki:

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]
1
FatihAkici 10 wrzesień 2018, 18:51

Jak wskazano @TERRYA, wiele odpowiedzi omówić, jak znaleźć wskaźnik jeden .

{X0}} jest biblioteką innej firmy z narzędziami do zlokalizowania wielu Wskaźniki w ramach iterable.

podane

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]

Sprawdź 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. Zainstaluj przez > pip install more_itertools.

0
pylang 25 wrzesień 2018, 15:47