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.