Existe-t-il une fonction contient courte pour les listes?

515

Je vois que les gens utilisent anypour rassembler une autre liste pour voir si un élément existe dans une liste, mais existe-t-il un moyen rapide de le faire ?:

if list.contains(myItem):
    # do something
Joan Venge
la source
Votre question implique que vous êtes uniquement intéressé par la liste contient un élément , pas la liste contient la sous-liste? / tuple / set / frozenset / ...?
smci

Réponses:

875

Vous pouvez utiliser cette syntaxe:

if myItem in list:
    # do something

Aussi, opérateur inverse:

if myItem not in list:
    # do something

Cela fonctionne très bien pour les listes, les tuples, les ensembles et les dict (vérifier les clés).

Notez qu'il s'agit d'une opération O (n) dans les listes et les tuples, mais une opération O (1) dans les ensembles et les dict.

defuz
la source
1
Avec une liste contenant des tableaux numpy, cela vérifiera-t-il les instances ou valeurs numpy à l'intérieur des instances numpy?
Daniel Möller
Il faut se méfier ! Cela correspond alors que c'est très probablement ce à quoi vous ne vous attendiez pas:o='--skip'; o in ("--skip-ias"); # returns True !
Alex F
3
@AlexF: Cela correspond parce que ce ("--skip-ias")n'est pas un tuple, mais une chaîne (les parenthèses ne font rien, tout comme (1)un entier). Si vous voulez un tuple, vous devez ajouter une virgule après l'élément unique: ("--skip-ias",)(ou (1,)).
Blckknght
Notez que si vous comparez des caractères, cela n'est pas sensible à la casse.
Tillson
65

En plus de ce que d'autres ont dit, vous pouvez également être intéressé de savoir que ce inqui est, c'est d'appeler la list.__contains__méthode, que vous pouvez définir sur n'importe quelle classe que vous écrivez et peut être extrêmement pratique pour utiliser python dans toute son étendue.  

Une utilisation stupide peut être:

>>> 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
>>>         
Fourmi
la source
5

J'ai récemment créé cette doublure pour savoir Truesi une liste contient un certain nombre d'occurrences d'un élément, ou Falsesi elle ne contient aucune occurrence ou rien du tout. L'utilisation next(...)donne à ceci une valeur de retour par défaut ( False) et signifie qu'il devrait fonctionner beaucoup plus rapidement que l'exécution de la compréhension de la liste entière.

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

Dustin Raimondi
la source
Dans mon cas, j'ai une liste d'objets appelée Catégorie et j'en ai besoin pour tester uniquement la propriété Link, donc cette solution convient mieux à mon cas. Merci
rodrigorf
3
any(item == test_item for item in list_to_test)fonctionnerait aussi, je pense?
quelqu'un le
3

La méthode list indexrenverra -1si l'élément n'est pas présent et renverra l'index de l'élément dans la liste s'il est présent. Dans une ifdéclaration, vous pouvez également effectuer les opérations suivantes:

if myItem in list:
    #do things

Vous pouvez également vérifier si un élément ne figure pas dans une liste avec l'instruction if suivante:

if myItem not in list:
    #do things
M. Squig
la source
15
La indexméthode ne renvoie pas -1 si l'élément n'est pas présent, elle lève une ValueErrorexception.
MondKin