Ich bin darauf gekommen:
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 mit Zeichenfolgen handelt).
Ist dies die "Pythonic" -Methode, um einen Artikel in einer Liste zu finden: if x in l:
?
Ihre erste Frage: Dieser Code ist vollkommen in Ordnung und sollte funktionieren, wenn item
einem der Elemente in myList
entspricht. Möglicherweise versuchen Sie, eine Zeichenfolge zu finden, die nicht genau einem der Elemente entspricht, oder Sie verwenden einen Float-Wert, der unter Ungenauigkeit leidet.
Zu Ihrer zweiten Frage: Es gibt mehrere Möglichkeiten, wenn Sie in Listen Dinge finden.
Dies ist der Anwendungsfall, den Sie beschreiben: Prüfen, ob sich etwas in einer Liste befindet oder nicht. Wie Sie wissen, können Sie den Operator in
dafür verwenden:
3 in [1, 2, 3] # => True
Das heißt, alle Elemente in einer Sequenz zu finden, die eine bestimmte Bedingung erfüllen. Sie können Listenverständnis oder Generatorausdrücke dafür verwenden:
matches = [x for x in lst if fulfills_some_condition(x)]
matches = (x for x in lst if x > 6)
Letzteres gibt ein Generator zurück, das Sie sich als eine Art faule Liste vorstellen können, die nur erstellt wird, wenn Sie sie durchlaufen. Das erste ist übrigens genau gleichbedeutend mit
matches = filter(fulfills_some_condition, lst)
in Python 2. Hier können Sie Funktionen höherer Ordnung bei der Arbeit sehen. In Python 3 gibt filter
keine Liste zurück, sondern ein generatorähnliches Objekt.
Wenn Sie nur das Erste wollen, das mit einer Bedingung übereinstimmt (Sie wissen jedoch noch nicht, was es ist), ist es in Ordnung, eine for-Schleife zu verwenden (möglicherweise unter Verwendung der Klausel else
, die nicht wirklich bekannt ist). Sie können auch verwenden
next(x for x in lst if ...)
das wird das erste Spiel zurückgeben oder eine StopIteration
erhöhen, wenn keine gefunden wird. Alternativ können Sie verwenden
next((x for x in lst if ...), [default value])
Für Listen gibt es auch die index
-Methode, die manchmal nützlich sein kann, wenn Sie where wissen möchten, dass sich ein bestimmtes Element in der Liste befindet:
[1,2,3].index(2) # => 1
[1,2,3].index(4) # => ValueError
Beachten Sie jedoch, dass .index
bei Duplikaten immer den niedrigsten Index zurückgibt: ......
[1,2,3,2].index(2) # => 1
Wenn Duplikate vorhanden sind und Sie alle Indizes benötigen, können Sie stattdessen enumerate()
verwenden:
[i for i,x in enumerate([1,2,3,2]) if x==2] # => [1, 3]
Wenn Sie ein Element suchen oder None
default in next
verwenden möchten, wird StopIteration
nicht ausgelöst, wenn das Element nicht in der Liste gefunden wurde:
first_or_default = next((x for x in lst if ...), None)
Die Antwort von Niklas B. ist zwar ziemlich umfassend, aber wenn wir ein Element in einer Liste finden wollen, ist es manchmal nützlich, seinen Index zu erhalten:
next((i for i, x in enumerate(lst) if [condition on x]), [default value])
Das erste Vorkommen finden
Es gibt ein Rezept dafür in itertools
:
def first_true(iterable, default=False, pred=None):
"""Returns the first true value in the iterable.
If no true value is found, returns *default*
If *pred* is not None, returns the first item
for which pred(item) is true.
"""
# first_true([a,b,c], x) --> a or b or c or x
# first_true([a,b], x, f) --> a if f(a) else b if f(b) else x
return next(filter(pred, iterable), default)
Der folgende Code findet beispielsweise die erste ungerade Zahl in einer Liste:
>>> first_true([2,3,4,5], None, lambda x: x%2==1)
3
Eine andere Alternative: Sie können mit if item in list:
überprüfen, ob sich ein Artikel in einer Liste befindet. Dies ist jedoch die Reihenfolge O (n). Wenn Sie mit großen Listen von Elementen zu tun haben und Sie nur wissen müssen, ob etwas Mitglied Ihrer Liste ist, können Sie die Liste zuerst in ein Set umwandeln und konstanten Zeitsatz suchen nutzen:
my_set = set(my_list)
if item in my_set: # much faster on average than using a list
# do something
Nicht in jedem Fall die richtige Lösung, aber in manchen 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 nur einmal tun müssen, ist es nicht schneller, dies auf diese Weise zu tun. Wenn Sie jedoch die Mitgliedschaft wiederholt überprüfen müssen, ist dies für jede Suche nach der Erstellung der ersten Gruppe O(1).
list = [10, 20, 30, 40, 50]
n = int(input("\nEnter a Number to search from the list : "))
if n in list :
print("\nMatch found")
else :
print("\nMatch not found")
Anstatt list.index(x)
zu verwenden, das den Index von x zurückgibt, wenn er in der Liste gefunden wird, oder eine #ValueError
-Nachricht zurückgibt, wenn x nicht gefunden wird, können Sie list.count(x)
verwenden, die die Anzahl der Vorkommen von x in der Liste zurückgibt ) oder sonst 0 (ohne x). Das Coole an count()
ist, dass es Ihren Code nicht beschädigt oder Sie müssen eine Ausnahme auslösen, wenn x nicht gefunden wird
Definition und Verwendung
die count()
-Methode gibt die Anzahl der Elemente mit dem angegebenen Wert zurück.
Syntax
list.count(value)
Beispiel:
fruits = ['Apple', 'banana', 'cherry']
x = fruits.count("cherry")
Beispiel der Frage:
item = someSortOfSelection()
if myList.count(item) >= 1 :
doMySpecialFunction(item)
Vergewissern Sie sich, dass in den Elementen der Liste der Zeichenfolgen kein zusätzlicher/unerwünschter Leerraum vorhanden ist. Dies ist ein Grund, der störend wirken kann, wenn die Elemente nicht erklärt werden können.
Möglicherweise möchten Sie beim Arbeiten mit der Liste der Zeichenfolgen eine von zwei möglichen Suchoptionen verwenden:
wenn das Listenelement gleich für ein Element ist ('example' ist in ['one', 'example', 'two']):
if item in your_list: some_function_on_true()
'ex' in ['eins', 'ex', 'zwei'] => Wahr
'ex_1' in ['eins', 'ex', 'zwei'] => Falsch
wenn das Listenelement like ein Element ist ('ex' ist in ['one', 'example', 'two'] oder 'example_1' ist in ['one', 'example', 'two') ]):
matches = [el for el in your_list if item in el]
oder
matches = [el for el in your_list if el in item]
dann einfach len(matches)
ankreuzen oder bei Bedarf vorlesen.