Czy jest krótka funkcja z listami?


514

Widzę, że ludzie używają anydo zebrania innej listy, aby sprawdzić, czy element istnieje na liście, ale czy istnieje szybki sposób, aby to zrobić ?:

if list.contains(myItem):
    # do something

Twoje pytanie sugeruje, że interesuje Cię tylko lista zawiera element , a nie lista zawiera listę podrzędną? / tuple / set / frozenset / ...?
smci

Odpowiedzi:


873

Możesz użyć tej składni:

if myItem in list:
    # do something

Ponadto operator odwrotny:

if myItem not in list:
    # do something

Działa dobrze w przypadku list, krotek, zestawów i nagrań (klawisze wyboru).

Zauważ, że jest to operacja O (n) w listach i krotkach, ale operacja O (1) w zestawach i słownikach.


1
Czy lista zawierająca tablice numpy sprawdzi, czy instancje numpy lub wartości znajdują się w instancjach numpy?
Daniel Möller,

Uwaga! To pasuje, podczas gdy jest to prawdopodobnie to, czego się nie spodziewałeś:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F

3
@AlexF: Pasuje, ponieważ ("--skip-ias")nie jest krotką, ale łańcuchem (nawiasy nic nie robią, tak jak (1)zwykła liczba całkowita). Jeśli chcesz 1-krotkę, musisz dodać przecinek po pojedynczym elemencie: ("--skip-ias",)(lub (1,)).
Blckknght,

Pamiętaj, że jeśli porównujesz znaki, nie uwzględnia to wielkości liter.
Tillson

65

Oprócz tego, co powiedzieli inni, możesz również chcieć wiedzieć, że to, co inrobi, to wywołać list.__contains__metodę, którą możesz zdefiniować w dowolnej klasie, którą piszesz, i może być bardzo przydatny w użyciu Pythona w pełnym zakresie.  

Głupie użycie może być:

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

Ostatnio wymyśliłem ten jeden linijka do sprawdzania, Trueczy lista zawiera dowolną liczbę wystąpień elementu lub Falsejeśli nie zawiera żadnych wystąpień lub w ogóle nic. Użycie next(...)daje domyślną wartość zwracaną ( False) i oznacza, że ​​powinien działać znacznie szybciej niż uruchamianie pełnego zrozumienia listy.

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


W moim przypadku mam listę obiektów o nazwie Kategoria i muszę ją przetestować tylko dla właściwości Link, więc to rozwiązanie lepiej pasuje w moim przypadku. Dzięki
rodrigorf,

3
any(item == test_item for item in list_to_test)też by działało, tak myślę?
ktoś

3

Metoda listy indexzwróci, -1jeśli element nie jest obecny, i zwróci indeks elementu na liście, jeśli jest obecny. Alternatywnie w ifinstrukcji możesz wykonać następujące czynności:

if myItem in list:
    #do things

Możesz również sprawdzić, czy elementu nie ma na liście za pomocą następującej instrukcji if:

if myItem not in list:
    #do things

15
indexSposób nie zwraca -1, jeśli element ten nie jest obecny, zgłasza ValueErrorwyjątek.
MondKin
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.