Ich bin auf Folgendes gestoßen:
item = someSortOfSelection()
if item in myList:
doMySpecialFunction(item)
aber manchmal funktioniert es nicht mit allen meinen Elementen, als ob sie in der Liste nicht erkannt würden (wenn es sich um eine Liste von Zeichenfolgen handelt).
Ist dies die "pythonischste" Art, ein Element in einer Liste zu finden : if x in l:
?
myList
.Antworten:
Was Ihre erste Frage betrifft: Dieser Code ist vollkommen in Ordnung und sollte funktionieren, wenn er
item
einem der darin enthaltenen Elemente entsprichtmyList
. Vielleicht versuchen Sie, eine Zeichenfolge zu finden, die nicht genau mit einem der Elemente übereinstimmt, oder Sie verwenden einen Gleitkommawert, der unter Ungenauigkeit leidet.Was Ihre zweite Frage betrifft: Es gibt tatsächlich mehrere Möglichkeiten, Dinge in Listen zu "finden".
Überprüfen, ob etwas drin ist
Dies ist der Anwendungsfall, den Sie beschreiben: Überprüfen, ob sich etwas in einer Liste befindet oder nicht. Wie Sie wissen, können Sie den
in
Operator dafür verwenden:Eine Sammlung filtern
Das heißt, alle Elemente in einer Sequenz finden, die eine bestimmte Bedingung erfüllen. Sie können dafür Listenverständnis oder Generatorausdrücke verwenden:
Letzterer gibt einen Generator zurück, den Sie sich als eine Art Lazy List vorstellen können, der erst erstellt wird, wenn Sie ihn durchlaufen. Übrigens ist der erste genau gleichbedeutend mit
in Python 2. Hier sehen Sie Funktionen höherer Ordnung bei der Arbeit. Gibt in Python 3
filter
keine Liste zurück, sondern ein generatorähnliches Objekt.Das erste Vorkommen finden
Wenn Sie nur das erste möchten, das einer Bedingung entspricht (aber Sie wissen noch nicht, was es ist), ist es in Ordnung, eine for-Schleife zu verwenden (möglicherweise auch die
else
Klausel, die nicht wirklich bekannt ist). Sie können auch verwendenDies gibt das erste Match zurück oder erhöht ein,
StopIteration
wenn keines gefunden wird. Alternativ können Sie verwendenSuchen des Standorts eines Elements
Für Listen gibt es auch die
index
Methode, die manchmal nützlich sein kann, wenn Sie wissen möchten, wo sich ein bestimmtes Element in der Liste befindet:Beachten Sie jedoch, dass bei Duplikaten
.index
immer der niedrigste Index zurückgegeben wird: ......Wenn es Duplikate gibt und Sie alle Indizes möchten, können Sie
enumerate()
stattdessen Folgendes verwenden :quelle
if x in list
ist nicht das, worüber sich die Leute beschweren, keine eingebaute Funktion zu sein. Sie beschweren sich über die Tatsache, dass es keinen expliziten Weg gibt, das erste Auftreten von etwas in einer Liste zu finden, das einer bestimmten Bedingung entspricht. Aber wie in meiner Antwort angegeben,next()
kann (ab) dafür verwendet werden.[list comprehension...][0]
Annäherungindex()
genannt ,key
dass wie das funktioniertekey
durch akzeptiertmax()
; zum Beispiel :index(list, key=is_prime)
.Wenn Sie ein Element suchen oder
None
die Standardeinstellung in verwenden möchtennext
, wird es nicht ausgelöst,StopIteration
wenn das Element nicht in der Liste gefunden wurde:quelle
next
Nimmt einen Iterator als ersten Parameter und eine Liste / ein Tupel ist KEIN Iterator. So soll es werdenfirst_or_default = next(iter([x for x in lst if ...]), None)
sehen docs.python.org/3/library/functions.html#next(x for x in lst if ...)
ist es, einen Generator über die Listelst
(die ist ein Iterator). Wenn Sie dies tunnext(iter([x for x in lst if ...]), None)
, müssen Sie die Liste[x for x in lst if ...]
erstellen, was eine viel teurere Operation ist.if
in ein Lambda und Sie könnenfind(fn,list)
normalerweise schreiben, anstatt den Generatorcode zu verschleiern.Während die Antwort von Niklas B. ziemlich umfassend ist, ist es manchmal nützlich, wenn wir ein Element in einer Liste finden möchten, seinen Index zu erhalten:
quelle
Das erste Vorkommen finden
Dafür gibt es ein Rezept in
itertools
:Der folgende Code findet beispielsweise die erste ungerade Zahl in einer Liste:
quelle
Eine andere Alternative: Sie können überprüfen, ob sich ein Element in einer Liste mit befindet
if item in list:
, dies ist jedoch die Reihenfolge O (n). Wenn Sie mit großen Listen von Elementen zu tun haben und nur wissen müssen, ob etwas Mitglied Ihrer Liste ist, können Sie die Liste zuerst in eine Gruppe konvertieren und die Suche nach konstanten Zeitsätzen nutzen :Dies ist nicht in jedem Fall die richtige Lösung, aber in einigen Fällen kann dies zu einer besseren Leistung führen.
Beachten Sie, dass das Erstellen des Sets mit
set(my_list)
auch O (n) ist. Wenn Sie dies also nur einmal tun müssen, ist es nicht schneller, dies auf diese Weise zu tun. Wenn Sie die Mitgliedschaft jedoch wiederholt überprüfen müssen, ist dies O (1) für jede Suche nach dieser ersten Satzerstellung.quelle
Möglicherweise möchten Sie eine von zwei möglichen Suchvorgängen verwenden, während Sie mit einer Liste von Zeichenfolgen arbeiten:
wenn Listenelement gleich ein Element ( ‚Beispiel‘ ist in [ ‚eines‘, ‚Beispiel‘, ‚zwei‘]):
if item in your_list: some_function_on_true()
'ex' in ['eins', 'ex', 'zwei'] => True
'ex_1' in ['eins', 'ex', 'zwei'] => Falsch
Wenn das Listenelement wie ein Element ist ('ex' steht in ['eins,' Beispiel ',' zwei '] oder' Beispiel_1 'steht in [' eins ',' Beispiel ',' zwei ']):
matches = [el for el in your_list if item in el]
oder
matches = [el for el in your_list if el in item]
dann überprüfen
len(matches)
oder lesen Sie sie bei Bedarf.quelle
Definition und Verwendung
Die
count()
Methode gibt die Anzahl der Elemente mit dem angegebenen Wert zurück.Syntax
Beispiel:
Beispiel der Frage:
quelle
Anstatt zu verwenden,
list.index(x)
welches den Index von x zurückgibt, wenn es in der Liste gefunden wird, oder eine#ValueError
Nachricht zurückgibt , wenn x nicht gefunden wird, können Sie verwenden,list.count(x)
welches die Anzahl der Vorkommen von x in der Liste zurückgibt (Bestätigung, dass x tatsächlich in der Liste enthalten ist) oder es Gibt ansonsten 0 zurück (in Abwesenheit von x). Das Coole darancount()
ist, dass es Ihren Code nicht kaputt macht oder Sie eine Ausnahme auslösen müssen, wenn x nicht gefunden wirdquelle
Wenn Sie einmal prüfen möchten, ob der Wert im Sammlerstück vorhanden ist, ist die Verwendung des Operators 'in' in Ordnung. Wenn Sie jedoch mehrmals prüfen möchten, empfehle ich die Verwendung des Halbierungsmoduls. Beachten Sie, dass die Daten des Halbierungsmoduls sortiert werden müssen. Sie sortieren die Daten also einmal und können dann die Halbierung verwenden. Die Verwendung des Halbierungsmoduls auf meinem Computer ist ungefähr 12-mal schneller als die Verwendung des In-Operators.
Hier ist ein Beispiel für Code mit Python 3.8 und höher:
Ausgabe:
quelle
Stellen Sie sicher, dass in den Elementen der Liste der Zeichenfolgen kein zusätzlicher / unerwünschter weißer Speicherplatz vorhanden ist. Dies ist ein Grund, der die Erklärung der Elemente stören kann.
quelle