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

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.


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

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)


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

15
La indexméthode ne renvoie pas -1 si l'élément n'est pas présent, elle lève une ValueErrorexception.
MondKin
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.