wake-up-neo.com

Suchen des Index eines Elements anhand einer Liste, in der es in Python enthalten ist

Wie erhalte ich für eine Liste ["foo", "bar", "baz"] und ein Element in der Liste "bar" den Index (1) in Python?

2785
Eugene M
>>> ["foo", "bar", "baz"].index("bar")
1

Referenz: Datenstrukturen> Mehr zu Listen

Vorsichtsmaßnahmen folgen

Beachten Sie, dass dies vielleicht die sauberste Methode ist, um die gestellte Frage zu beantworten . index ist jedoch eine eher schwache Komponente der API list, und ich kann es nicht erinnere mich an das letzte Mal, als ich es im Zorn benutzte. In den Kommentaren wurde ich darauf hingewiesen, dass diese Antwort, da sie stark referenziert wird, vollständiger sein sollte. Einige Vorbehalte zu list.index folgen. Es lohnt sich wahrscheinlich, zunächst einen Blick auf den Docstring zu werfen:

>>> print(list.index.__doc__)
L.index(value, [start, [stop]]) -> integer -- return first index of value.
Raises ValueError if the value is not present.

Lineare Zeitkomplexität in der Listenlänge

Ein Aufruf von index überprüft jedes Element der Liste in der angegebenen Reihenfolge, bis eine Übereinstimmung gefunden wird. Wenn Ihre Liste lang ist und Sie nicht genau wissen, wo in der Liste sie vorkommt, kann diese Suche zu einem Engpass werden. In diesem Fall sollten Sie eine andere Datenstruktur berücksichtigen. Beachten Sie, dass Sie index einen Hinweis geben können, wenn Sie ungefähr wissen, wo Sie die Übereinstimmung finden. Beispiel: In diesem Snippet ist l.index(999_999, 999_990, 1_000_000) ungefähr fünf Größenordnungen schneller als gerade l.index(999_999), da erstere nur 10 Einträge durchsuchen muss, während letztere eine Million durchsuchen:

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

Gibt nur den Index der ersten Übereinstimmung mit seinem Argument zurück

Ein Aufruf von index durchsucht die Liste nacheinander, bis eine Übereinstimmung gefunden wird, und hält dort an. Wenn Sie erwarten, Indizes mit mehr Übereinstimmungen zu benötigen, sollten Sie dies tun Verwenden Sie ein Listenverständnis oder einen Generatorausdruck.

>>> [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

An den meisten Stellen, an denen ich früher index verwendet hätte, verwende ich jetzt ein Listenverständnis oder einen Generatorausdruck, weil sie allgemeiner sind. Wenn Sie also nach index greifen möchten, schauen Sie sich diese hervorragenden python Funktionen an.

Wird ausgelöst, wenn das Element nicht in der Liste vorhanden ist

Ein Aufruf von index führt zu ValueError, wenn das Element nicht vorhanden ist.

>>> [1, 1].index(2)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: 2 is not in list

Wenn das Element möglicherweise nicht in der Liste vorhanden ist, sollten Sie dies auch tun

  1. Überprüfen Sie dies zuerst mit item in my_list (sauberer, lesbarer Ansatz) oder
  2. Schließen Sie den Aufruf von index in einen Block try/except ein, der ValueError auffängt (wahrscheinlich schneller, zumindest wenn die zu durchsuchende Liste lang ist und das Element normalerweise vorhanden ist).
3983
Alex Coventry

Eine Sache, die beim Erlernen von Python sehr hilfreich ist, ist die Verwendung der interaktiven Hilfefunktion:

>>> help(["foo", "bar", "baz"])
Help on list object:

class list(object)
 ...

 |
 |  index(...)
 |      L.index(value, [start, [stop]]) -> integer -- return first index of value
 |

das führt Sie oft zu der Methode, nach der Sie suchen.

851
davidavr

In den meisten Antworten wird erläutert, wie ein einzelner Index gefunden wird , aber ihre Methoden geben nicht mehrere Indizes zurück, wenn das Element mehrmals in der Liste enthalten ist. Verwenden Sie enumerate() :

for i, j in enumerate(['foo', 'bar', 'baz']):
    if j == 'bar':
        print(i)

Die Funktion index() gibt nur das erste Vorkommen zurück, während enumerate() alle Vorkommen zurückgibt.

Als Listenverständnis:

[i for i, j in enumerate(['foo', 'bar', 'baz']) if j == 'bar']

Hier ist auch eine andere kleine Lösung mit itertools.count() (das ist so ziemlich der gleiche Ansatz wie 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']

Dies ist effizienter für größere Listen als die Verwendung von 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
506
TerryA

So rufen Sie alle Indizes ab:

indexes = [i for i,x in enumerate(xs) if x == 'foo']
149
FMc

index() liefert den ersten Wertindex!

| Index(...)
| L.index (Wert, [Start, [Stopp]]) -> Ganzzahl - Gibt den ersten Wertindex zurück

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"])
123
HongboZhu

Ein Problem tritt auf, wenn das Element nicht in der Liste enthalten ist. Diese Funktion behandelt das 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
75
tanzil
a = ["foo","bar","baz",'bar','any','much']

indexes = [index for index in range(len(a)) if a[index] == 'bar']
69
savinson

Sie müssen eine Bedingung festlegen, um zu überprüfen, ob das gesuchte Element in der Liste enthalten ist

if 'your_element' in mylist:
    print mylist.index('your_element')
else:
    print None
50
user3670684

Alle hier vorgeschlagenen Funktionen reproduzieren das inhärente Sprachverhalten, verdecken jedoch die Vorgänge.

[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

Warum eine Funktion mit Ausnahmebehandlung schreiben, wenn die Sprache die Methoden bietet, um das zu tun, was Sie selbst wollen?

40
Graham Giller

Wenn Sie alle Indizes möchten, können Sie NumPy verwenden:

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),)

Es ist eine klare, lesbare Lösung.

35
rbrisuda

Suchen des Index eines Elements anhand einer Liste in Python

Was ist für eine Liste ["foo", "bar", "baz"] und ein Element in der Liste "bar" die sauberste Methode, um den Index (1) in Python abzurufen?

Nun, sicher, es gibt die Indexmethode, die den Index des ersten Vorkommens zurückgibt:

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

Es gibt ein paar Probleme mit dieser Methode:

  • wenn der Wert nicht in der Liste enthalten ist, wird ValueError angezeigt.
  • wenn mehr als einer der Werte in der Liste enthalten ist, erhalten Sie nur den Index für den ersten

Keine Werte

Wenn der Wert fehlen könnte, müssen Sie das ValueError abfangen.

Sie können dies mit einer wiederverwendbaren Definition wie der folgenden tun:

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

Und benutze es so:

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

Und der Nachteil dabei ist, dass Sie wahrscheinlich prüfen müssen, ob der zurückgegebene Wert is oder is not None ist:

result = index(a_list, value)
if result is not None:
    do_something(result)

Mehr als ein Wert in der Liste

Wenn Sie weitere Vorkommen haben könnten, erhalten Sie mit list.index keine vollständigen Informationen :

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

Sie können die Indizes in einem Listenverständnis auflisten:

>>> [index for index, v in enumerate(l) if v == 'bar']
[1, 3]
>>> [index for index, v in enumerate(l) if v == 'boink']
[]

Wenn Sie keine Vorkommen haben, können Sie dies mit einer booleschen Prüfung des Ergebnisses überprüfen oder einfach nichts tun, wenn Sie die Ergebnisse durchlaufen:

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

Bessere Datenübertragung mit Pandas

Wenn Sie Pandas haben, können Sie diese Informationen einfach mit einem Series-Objekt abrufen:

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

Eine Vergleichsprüfung gibt eine Reihe von Booleschen Werten zurück:

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

Übergeben Sie diese Reihe von Booleschen Werten über die Indexnotation an die Reihe, und Sie erhalten nur die übereinstimmenden Elemente:

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

Wenn Sie nur die Indizes möchten, gibt das index-Attribut eine Reihe von Ganzzahlen zurück:

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

Und wenn Sie sie in einer Liste oder einem Tupel haben möchten, übergeben Sie sie einfach an den Konstruktor:

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

Ja, Sie könnten auch ein Listenverständnis mit Aufzählung verwenden, aber das ist meiner Meinung nach nicht so elegant - Sie führen in Python Tests auf Gleichheit durch, anstatt den in C geschriebenen Code damit umgehen zu lassen:

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

Ist das ein XY-Problem ?

Das XY-Problem fragt nach Ihrer versuchten Lösung und nicht nach Ihrem tatsächlichen Problem.

Warum brauchen Sie den Index für ein Element in einer Liste?

Wenn Sie den Wert bereits kennen, warum interessiert es Sie, wo er in einer Liste enthalten ist?

Wenn der Wert nicht vorhanden ist, ist das Abfangen von ValueError ziemlich ausführlich - und das vermeide ich lieber.

Normalerweise durchlaufe ich die Liste trotzdem, daher behalte ich normalerweise einen Zeiger auf interessante Informationen und erhalte den Index mit Aufzählung.

Wenn Sie Daten mischen, sollten Sie wahrscheinlich pandas verwenden, das weitaus elegantere Tools als die von mir gezeigten reinen Python Workarounds enthält.

Ich kann mich nicht erinnern, list.index selbst gebraucht zu haben. Ich habe jedoch die Standardbibliothek Python durchgesehen und sehe einige ausgezeichnete Verwendungsmöglichkeiten dafür.

Es gibt viele, viele Verwendungsmöglichkeiten in idlelib für die grafische Benutzeroberfläche und das Parsen von Text.

Das keyword Modul verwendet es, um Kommentarmarkierungen im Modul zu finden, um die Liste der darin enthaltenen Schlüsselwörter automatisch durch Metaprogrammierung neu zu generieren.

In Lib/mailbox.py scheint es wie ein geordnetes Mapping zu funktionieren:

key_list[key_list.index(old)] = new

und

del key_list[key_list.index(key)]

In Lib/http/cookiejar.py scheint verwendet zu werden, um den nächsten Monat zu bekommen:

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

In Lib/tarfile.py ähnlich wie distutils, um einen Slice zu einem Objekt zu erstellen:

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

In Lib/pickletools.py:

numtopop = before.index(markobject)

Allen diesen Verwendungen scheint gemeinsam zu sein, dass sie anscheinend mit Listen mit eingeschränkten Größen arbeiten (wichtig wegen der O(n)-Nachschlagezeit für list.index), und sie werden hauptsächlich in verwendet Parsing (und UI im Fall von Idle).

Obwohl es Anwendungsfälle dafür gibt, sind sie ziemlich ungewöhnlich. Wenn Sie auf der Suche nach dieser Antwort sind, fragen Sie sich, ob Sie die von der Sprache für Ihren Anwendungsfall bereitgestellten Tools am direktesten verwenden.

27
Aaron Hall

Alle Indizes mit der Funktion Zip :

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')

Abrufen aller Vorkommen und der Position eines oder mehrerer (identischer) Elemente in einer Liste

Mit enumerate (alist) können Sie das erste Element (n) speichern, das der Index der Liste ist, wenn das Element x dem entspricht, wonach Sie suchen.

>>> alist = ['foo', 'spam', 'Egg', 'foo']
>>> foo_indexes = [n for n,x in enumerate(alist) if x=='foo']
>>> foo_indexes
[0, 3]
>>>

Lassen Sie uns unsere Funktion findindex machen

Diese Funktion nimmt das Element und die Liste als Argumente und gibt die Position des Elements in der Liste zurück, wie wir es zuvor gesehen haben.

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

Ausgabe


[1, 3, 5, 7]

Einfach

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

Ausgabe:

0
4
19
Giovanni Python

Einfach können Sie mit gehen

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

res = [[x[0] for x in a].index(y) for y in b]
16
kiriloff

Andere Option

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

Und jetzt etwas ganz anderes...

... wie das Bestätigen der Existenz des Elements, bevor der Index abgerufen wird. Das Schöne an diesem Ansatz ist, dass die Funktion immer eine Liste von Indizes zurückgibt - auch wenn es sich um eine leere Liste handelt. Es funktioniert auch mit Streichern.

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')

Beim Einfügen in ein interaktives python Fenster:

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

Aktualisieren

Nach einem weiteren Jahr Heads-Down-Entwicklung python ist mir meine ursprüngliche Antwort etwas peinlich. Die viel idiomatischere Methode, um dasselbe Verhalten zu erzielen, ist die Verwendung des Listenverständnisses zusammen mit der Funktion enumerate ().

Etwas wie das:

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')

Was beim Einfügen in ein interaktives python Fenster ergibt:

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

Und jetzt, nachdem ich diese Frage und alle Antworten durchgesehen habe, stelle ich fest, dass dies genau das ist, was FMc in seiner früheren Antwort vorgeschlagen hat. Als ich diese Frage ursprünglich beantwortete, habe ich diese Antwort nicht einmal gesehen , weil ich sie nicht verstanden habe. Ich hoffe, dass mein etwas ausführlicheres Beispiel zum Verständnis beiträgt.

Wenn die einzelne Codezeile oben immer noch keinen Sinn ergibt , empfehle ich Ihnen dringend, die Python-Liste von Google zu verstehen und sich ein paar Minuten Zeit zu nehmen Machen Sie sich vertraut. Dies ist nur eine der vielen leistungsstarken Funktionen, mit denen die Entwicklung von Code mit Python zum Vergnügen wird.

15
MrWonderful

Eine Variante der Antwort von FMc und user7177 gibt ein Diktat aus, das alle Indizes für jeden Eintrag zurückgeben kann:

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

Sie können dies auch als Einzeiler verwenden, um alle Indizes für einen einzelnen Eintrag abzurufen. Es gibt keine Garantien für die Effizienz, obwohl ich set (a) verwendet habe, um die Anzahl der Lambda-Aufrufe zu verringern.

12
bvanlew

Diese Lösung ist nicht so leistungsfähig wie andere, aber wenn Sie Anfänger sind und nur über forloops Bescheid wissen, können Sie den ersten Index eines Elements finden, ohne den ValueError:

def find_element(p,t):
    i = 0
    for e in p:
        if e == t:
            return i
        else:
            i +=1
    return -1
10
dylankb

Findet den Index von Punkt x in Liste L:

idx = L.index(x) if (x in L) else -1
6
Ketan

Da Python Listen auf Null basieren, können wir die integrierte Zip-Funktion wie folgt verwenden:

>>> [i for i,j in Zip(range(len(haystack)), haystack) if j == 'needle' ]

dabei ist "Heuhaufen" die fragliche Liste und "Nadel" das zu suchende Element.

(Hinweis: Hier iterieren wir mit i, um die Indizes zu erhalten. Wenn wir uns jedoch eher auf die Elemente konzentrieren müssen, können wir zu j wechseln.)

5
jihed gasmi
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)

Dies berücksichtigt, wenn die Zeichenfolge nicht in der Liste enthalten ist, und wenn sie nicht in der Liste enthalten ist, location = -1

5
Coder123

Die Methode Python index() gibt einen Fehler aus, wenn das Element nicht gefunden wurde. Sie können es also stattdessen der Funktion indexOf() von JavaScript ähnlich machen, die -1 zurückgibt, wenn das Element nicht gefunden wurde:

try:
    index = array.index('search_keyword')
except ValueError:
    index = -1
4
Hamed Baatour

Es gibt zwei Möglichkeiten, wenn die Liste keine wiederholten Elemente enthält, auf die Sie den Index überprüfen müssen

 eg: li=[10,20,30] # here need to get index of 20 means
     li.index(20) # will work properly because 20 is not repeated

wenn dies wiederholt wird, erhalten Sie nur den ersten Index

Wenn Sie den gesamten Index abrufen müssen, in dem sich das Element befindet, bedeutet dies

eg: li=[10,20,30,20,40, 50, 10] # here need to get index of 20 means its have 2 index (1,3) 

um das zu bekommen musst du es so machen

 li=[10,20,30,20,40, 50, 10]
 [i for i, e in enumerate(li) if e == 20]

dann erhalten Sie eine Indexliste mit o/p wie [1,3]

3
abhi krishnan

Darauf gibt es eine funktionalere Antwort.

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

Allgemeinere Form:

def get_index_of(lst, element):
    return list(map(lambda x: x[0],\
       (list(filter(lambda x: x[1]==element, enumerate(lst))))))
3
Ankit Gupta

Geben Sie der Liste, die Sie haben, den Namen lst. Man kann die Liste lst in einen numpy array konvertieren. Verwenden Sie dann numpy.where , um den Index des ausgewählten Elements in der Liste abzurufen. Im Folgenden wird beschrieben, wie Sie es implementieren.

import numpy as np

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

>>> 1
2

Für diejenigen, die aus einer anderen Sprache wie mir kommen, ist es möglicherweise mit einer einfachen Schleife einfacher, diese zu verstehen und zu verwenden:

mylist = ["foo", "bar", "baz", "bar"]
newlist = enumerate(mylist)
for index, item in newlist:
  if item == "bar":
    print(index, item)

Ich bin dankbar für Was genau macht Aufzählung?. Das hat mir geholfen zu verstehen.

1
mpoletto

Wenn die Leistung von Belang ist:

In zahlreichen Antworten wird erwähnt, dass die eingebaute Methode der list.index(item)-Methode ein O(n) - Algorithmus ist. Es ist in Ordnung, wenn Sie dies einmal ausführen müssen. Wenn Sie jedoch mehrmals auf die Indizes von Elementen zugreifen müssen, ist es sinnvoller, zuerst ein Wörterbuch (O (n)) von Element-Index-Paaren zu erstellen und dann unter O(1) auf den Index zuzugreifen. jedes mal wenn du es brauchst.

Wenn Sie sicher sind, dass die Elemente in Ihrer Liste nie wiederholt werden, können Sie einfach:

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.

Wenn Sie möglicherweise doppelte Elemente haben und alle ihre Indizes zurückgeben müssen:

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

Wie von @TerryA angegeben, diskutieren viele Antworten, wie ein Index gefunden werden kann.

more_itertools ist eine Drittanbieter-Bibliothek mit Werkzeugen zum Auffinden mehrerer Indizes innerhalb eines Iterationsobjekts.

Gegeben

_import more_itertools as mit


iterable = ["foo", "bar", "baz", "ham", "foo", "bar", "baz"]
_

Code

Finden Sie Indizes mehrerer Beobachtungen:

_list(mit.locate(iterable, lambda x: x == "bar"))
# [1, 5]
_

Testen Sie mehrere Artikel:

_list(mit.locate(iterable, lambda x: x in {"bar", "ham"}))
# [1, 3, 5]
_

Siehe auch weitere Optionen mit more_itertools.locate . Installieren Sie über > pip install more_itertools .

1
pylang

verwenden des Wörterbuchs, wobei zuerst die Liste verarbeitet und dann der Index hinzugefügt wird

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
prashant rana