4394 Stimmen

Wie finde ich den Index für ein bestimmtes Element in einer Liste?

Gegeben eine Liste ["foo", "bar", "baz"] und ein Element in der Liste "bar", wie erhalte ich seinen Index 1?

16 Stimmen

Übersetzung: Kehren Sie zurück: [1] Der niedrigste Index im Falle mehrerer Instanzen von "bar", [2] Alle Indizes von "bar"?

7 Stimmen

A) Ist es garantiert, dass der Eintrag in der Liste ist, oder wie sollten wir den Fehlerfall behandeln? (None zurückgeben/ ValueError werfen) b) Sind Listeneinträge garantiert einzigartig, und sollten wir den ersten Index eines Treffers zurückgeben oder alle Indizes?

1 Stimmen

Betrachten Sie die Antworten mit numpy-Integration, numpy-Arrays sind weitaus effizienter als Python-Listen. Wenn die Liste kurz ist, ist es kein Problem, eine Kopie davon aus einer Python-Liste zu machen. Wenn nicht, sollten Sie vielleicht erwägen, die Elemente gleich von Anfang an in einem numpy-Array zu speichern.

22voto

MrWonderful Punkte 2402

Und jetzt etwas ganz anderes...

... wie die Bestätigung des Vorhandenseins des Elements, bevor der Index erhalten wird. Der schöne Aspekt dieses Ansatzes ist, dass die Funktion immer eine Liste von Indizes zurückgibt - auch wenn es eine leere Liste ist. Es funktioniert auch mit Strings.

def indices(l, val):
    """Gibt immer eine Liste zurück, die die Indizes von val in the_list enthält"""
    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')

Wenn Sie es in ein interaktives Python-Fenster einfügen:

Python 2.7.6 (v2.7.6:3a1db0d2747e, 10. Nov 2013, 00:42:54) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] auf Darwin
Geben Sie "help", "copyright", "credits" oder "license" für weitere Informationen ein.
>>> def indices(the_list, val):
...     """Gibt immer eine Liste zurück, die die Indizes von val in the_list enthält"""
...     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]
>>> 

Aktualisierung

Nach einem weiteren Jahr intensiver Python-Entwicklung bin ich etwas peinlich berührt von meiner ursprünglichen Antwort, daher kann man sicherlich den obigen Code verwenden; jedoch ist der viel idiomatischere Weg, um das gleiche Verhalten zu erzielen, die Verwendung von List Comprehension zusammen mit der enumerate() Funktion.

Etwas in der Art:

def indices(l, val):
    """Gibt immer eine Liste zurück, die die Indizes von val in the_list enthält"""
    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, wenn es in ein interaktives Python-Fenster eingefügt wird, ergibt:

Python 2.7.14 |Anaconda, Inc.| (default, 7. Dez 2017, 11:07:58) 
[GCC 4.2.1 Compatible Clang 4.0.1 (tags/RELEASE_401/final)] auf Darwin
Geben Sie "help", "copyright", "credits" oder "license" für weitere Informationen ein.
>>> def indices(l, val):
...     """Gibt immer eine Liste zurück, die die Indizes von val in the_list enthält"""
...     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 überprüft habe, erkenne ich, dass dies genau ist, was FMc bereits in seiner früheren Antwort vorgeschlagen hat. Zum Zeitpunkt meiner ursprünglichen Beantwortung dieser Frage habe ich diese Antwort nicht einmal gesehen, weil ich sie nicht verstanden habe. Ich hoffe, dass mein etwas ausführlicheres Beispiel das Verständnis fördern wird.

Wenn die obige Einzeiler noch immer keinen Sinn für Sie ergibt, empfehle ich Ihnen dringend, Google nach "Python List Comprehension" zu durchsuchen und sich damit vertraut zu machen. Es ist nur eine der vielen leistungsstarken Funktionen, die es zu einer Freude machen, Python zur Entwicklung von Code zu verwenden.

20voto

LunaticXXD10 Punkte 276

Hier ist ein Zweizeiler, der die index()-Funktion von Python verwendet:

LIST = ['foo' ,'boo', 'shoo']
print(LIST.index('boo'))

Ausgabe: 1

2 Stimmen

Diese Lösung wurde bereits mehrmals bereitgestellt, einschließlich der akzeptierten und am besten bewerteten Antwort. Warum es erneut bereitstellen?

17voto

bvanlew Punkte 1375

Ein Varianten der Antwort von FMc und Benutzer7177 wird ein dict liefern, 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önnten dies auch als Einzeiler verwenden, um alle Indizes für einen einzelnen Eintrag zu erhalten. Es gibt jedoch keine Garantien für Effizienz, obwohl ich set(a) verwendet habe, um die Anzahl der Aufrufe des Lambda zu reduzieren.

2 Stimmen

Diese Antwort sollte besser hier gepostet werden: stackoverflow.com/questions/6294179/…

16voto

Ketan Punkte 1297

Index des Elements x in der Liste L finden:

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

6 Stimmen

Dies durchläuft das Array zweimal, was zu Leistungsproblemen bei großen Arrays führen könnte.

0 Stimmen

@Cristik - Richtig. Nicht geeignet, wenn keine vernünftig niedrige obere Grenze für die Listenlänge verfügbar ist.

0 Stimmen

Sollte nur für nicht wiederholende Aufgaben/Bereitstellungen verwendet werden, oder wenn die Listenlänge relativ klein genug ist, um die Gesamtleistung nicht spürbar zu beeinträchtigen.

14voto

dylankb Punkte 1040

Diese Lösung ist nicht so leistungsfähig wie andere, aber wenn Sie Anfänger sind und nur über for-Schleifen Bescheid wissen, ist es dennoch möglich, den ersten Index eines Elements zu finden und dabei den ValueError zu vermeiden:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X