it-swarm.com.de

Python: Find in Liste

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

424

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.

Überprüfen, ob etwas drin ist

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

Eine Sammlung filtern

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.

Das erste Vorkommen finden

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

Ermitteln des Standorts eines Elements

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]
927
Niklas B.

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

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])
14
Vincent Cantin

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  
7

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

2
Engineero
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")
1
Rekha V

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

0
Taylor

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)
0
josef

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.

0

Möglicherweise möchten Sie beim Arbeiten mit der Liste der Zeichenfolgen eine von zwei möglichen Suchoptionen verwenden:

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

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

0