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.
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.
1 Stimmen
Ich stimme dafür, diese Frage zu schließen (aus Protest), weil es bereits 42 nicht gelöschte Antworten gibt (und 16 weitere gelöschte) für eine einfache, Einzeiler-Referenzfrage, bei der fast alle den gleichen Kernfunktion im verwenden (wie sie es sollten, weil es der einzige vernünftige und gesunde Ansatz für das Problem ist und alles darum herum nur Fehlerüberprüfung oder kreatives Neuinterpretieren der Spezifikation ist, was immer noch nur einen anderen vernünftigen, gesunden Ansatz zum erweiterten Problem hinterlässt).
0 Stimmen
Es gibt keine realistische Chance, dass in zukünftigen Versionen von Python ein besserer Ansatz möglich wird, da der vorhandene Ansatz bereits das Aufrufen einer einzigen integrierten Methode in der Liste ist - so einfach wie es nur geht.