Gibt es eine Short-Include-Funktion für Listen?


514

Ich sehe, dass Leute verwenden any, um eine andere Liste zu sammeln, um zu sehen, ob ein Element in einer Liste vorhanden ist, aber gibt es eine schnelle Möglichkeit, dies einfach zu tun?:

if list.contains(myItem):
    # do something

Ihre Frage impliziert, dass Sie nur an einer Liste mit Elementen interessiert sind , nicht an einer Liste mit Unterlisten. / tuple / set / frozenset / ...?
smci

Antworten:


873

Sie können diese Syntax verwenden:

if myItem in list:
    # do something

Auch inverser Operator:

if myItem not in list:
    # do something

Es funktioniert gut für Listen, Tupel, Sets und Diktate (Check Keys).

Beachten Sie, dass dies eine O (n) -Operation in Listen und Tupeln ist, aber eine O (1) -Operation in Mengen und Diktaten.


1
Wird bei einer Liste mit Numpy-Arrays nach Numpy-Instanzen oder Werten innerhalb der Numpy-Instanzen gesucht?
Daniel Möller

In acht nehmen ! Dies passt, obwohl dies sehr wahrscheinlich das ist, was Sie nicht erwartet haben:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: Das stimmt überein, weil ("--skip-ias")es kein Tupel ist, sondern eine Zeichenfolge (die Klammern tun nichts, genauso wie (1)es nur eine ganze Zahl ist). Wenn Sie ein 1-Tupel möchten, müssen Sie nach dem einzelnen Element ein Komma einfügen: ("--skip-ias",)(oder (1,)).
Blckknght

Beachten Sie, dass beim Vergleichen von Zeichen die Groß- und Kleinschreibung nicht berücksichtigt wird.
Tillson

65

Zusätzlich zu dem, was andere gesagt haben, könnte es Sie auch interessieren, zu wissen, dass indie list.__contains__Methode aufgerufen wird, dass Sie sie für jede Klasse definieren können, die Sie schreiben, und dass es äußerst praktisch sein kann, Python in vollem Umfang zu verwenden.  

Eine dumme Verwendung kann sein:

>>> class ContainsEverything:
    def __init__(self):
        return None
    def __contains__(self, *elem, **k):
        return True


>>> a = ContainsEverything()
>>> 3 in a
True
>>> a in a
True
>>> False in a
True
>>> False not in a
False
>>>         

5

Ich habe mir kürzlich diesen einen Liner ausgedacht, um herauszufinden, Trueob eine Liste eine beliebige Anzahl von Vorkommen eines Elements Falseenthält oder ob sie keine Vorkommen oder gar nichts enthält. Die Verwendung next(...)gibt diesem einen Standardrückgabewert ( False) und bedeutet, dass er erheblich schneller ausgeführt werden sollte als das gesamte Listenverständnis.

list_does_contain = next((True for item in list_to_test if item == test_item), False)


In meinem Fall habe ich eine Liste von Objekten namens Kategorie und muss sie nur für die Eigenschaft Link testen, damit diese Lösung in meinem Fall besser passt. Danke
Rodrigorf

3
any(item == test_item for item in list_to_test)würde auch funktionieren, denke ich?
Jemand

3

Die Listenmethode indexgibt zurück, -1wenn das Element nicht vorhanden ist, und gibt den Index des Elements in der Liste zurück, wenn es vorhanden ist. Alternativ können Sie in einer ifAnweisung Folgendes tun:

if myItem in list:
    #do things

Sie können auch mit der folgenden if-Anweisung überprüfen, ob ein Element nicht in einer Liste enthalten ist:

if myItem not in list:
    #do things

15
Die indexMethode gibt -1 nicht zurück, wenn das Element nicht vorhanden ist, sondern löst eine ValueErrorAusnahme aus.
MondKin
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.