609 votes

Existe-t-il une fonction de contenu court pour les listes ?

Je vois que les gens utilisent any pour rassembler une autre liste afin de voir si un élément existe dans une liste, mais existe-t-il un moyen rapide de faire quelque chose comme ça ?

if list.contains(myItem):
    # do something

0 votes

Votre question implique que vous êtes seulement intéressé par la liste contient un élément pas la liste contient une sous-liste ? /tuple/ set/ frozenset/... ?

1011voto

defuz Points 5575

Vous pouvez utiliser cette syntaxe :

if myItem in some_list:
    # do something

Aussi, opérateur inverse :

if myItem not in some_list:
    # do something

Il fonctionne bien pour les listes, les tuples, les ensembles et les dicts (clés de contrôle).

Note que c'est une opération O(n) dans les listes et les tuples, mais une opération O(1) dans les ensembles et les dicts.

1 votes

Avec une liste contenant des tableaux numpy, cela vérifiera-t-il les instances numpy ou les valeurs à l'intérieur des instances numpy ?

0 votes

Attention ! Cela correspond alors que c'est très probablement ce à quoi vous ne vous attendiez pas : o='--skip'; o in ("--skip-ias"); # returns True !

6 votes

@AlexF : Cela correspond parce que ("--skip-ias") n'est pas un tuple, mais une chaîne de caractères (les parenthèses ne font rien, tout comme (1) est juste un nombre entier). Si vous voulez un 1-tuple, vous devez ajouter une virgule après l'élément unique : ("--skip-ias",) (ou (1,) ).

71voto

Ant Points 1953

En plus de ce que d'autres ont dit, vous serez peut-être intéressé de savoir que ce qui in est d'appeler le list.__contains__ que vous pouvez définir sur n'importe quelle classe que vous écrivez et qui peut s'avérer extrêmement pratique pour utiliser python dans toute son étendue.  

Une utilisation débile 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
>>>

7voto

Dustin Raimondi Points 110

J'ai eu l'idée d'une doublure récemment pour obtenir True si une liste contient un nombre quelconque d'occurrences d'un élément, ou False s'il ne contient aucune occurrence ou rien du tout. Utilisation de next(...) lui donne une valeur de retour par défaut ( False ) et signifie qu'il devrait s'exécuter 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)

5voto

Mr. Squig Points 913

La méthode de la liste index retournera -1 si l'élément n'est pas présent, et renvoie l'index de l'élément dans la liste s'il est présent. Alternativement, dans un if vous pouvez faire ce qui suit :

if myItem in list:
    #do things

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

if myItem not in list:
    #do things

17 votes

El index ne renvoie pas -1 si l'élément n'est pas présent, elle lance une erreur de type ValueError exception.

1voto

Andreas Points 4562

Il existe également la méthode de la liste :

[2, 51, 6, 8, 3].__contains__(8)
# Out[33]: True
[2, 51, 6, 3].__contains__(8)
# Out[33]: False

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X