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 ?:
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 notin 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.
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:
>>>classContainsEverything:def __init__(self):returnNonedef __contains__(self,*elem,**k):returnTrue>>> a =ContainsEverything()>>>3in a
True>>> a in a
True>>>Falsein a
True>>>Falsenotin a
False>>>
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:
Réponses:
Vous pouvez utiliser cette syntaxe:
Aussi, opérateur inverse:
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.
la source
o='--skip'; o in ("--skip-ias"); # returns True !
("--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,)
).En plus de ce que d'autres ont dit, vous pouvez également être intéressé de savoir que ce
in
qui est, c'est d'appeler lalist.__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:
la source
J'ai récemment créé cette doublure pour savoir
True
si une liste contient un certain nombre d'occurrences d'un élément, ouFalse
si elle ne contient aucune occurrence ou rien du tout. L'utilisationnext(...)
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)
la source
any(item == test_item for item in list_to_test)
fonctionnerait aussi, je pense?La méthode list
index
renverra-1
si 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 uneif
déclaration, vous pouvez également effectuer les opérations suivantes:Vous pouvez également vérifier si un élément ne figure pas dans une liste avec l'instruction if suivante:
la source
index
méthode ne renvoie pas -1 si l'élément n'est pas présent, elle lève uneValueError
exception.