J'essaie de trouver un moyen rapide de voir si l'un des éléments suivants figure dans une liste, mais ma première tentative ne fonctionne pas. Outre l'écriture d'une fonction pour y parvenir, il existe un moyen court et simple de vérifier si l'un des éléments multiples est dans une liste.
>>> a = [2,3,4]
>>> print (1 or 2) in a
False
>>> print (2 or 1) in a
True
a = [1, 2] b = [3, 5, 2, 6, 8, 9] c = [3, 5, 6, 8, 1, 9] print( (1 and 2) in b ,(2 and 1) in b ,(1 and 2) in c ,(2 and 1) in c, sep='\n')
est vrai faux faux vraiRéponses:
Les listes vides et les ensembles vides sont faux, vous pouvez donc utiliser la valeur directement comme valeur de vérité.
la source
any
peut revenir tôt dès qu'elle trouve uneTrue
valeur - elle n'a pas besoin de construire d'abord la liste entièreAh, Tobias, tu m'as battu. Je pensais à cette légère variation de votre solution:
la source
x in long for x in short
vsx in short for x in long
)a
etb
sont de même longueur, max et min liste la plus à gauche, ce qui fera que l'any()
appel fonctionnera sur la même liste des deux côtés. Si vous avez besoin absolument vérifier la longueur, inverser l'ordre des listes dans le deuxième appel:any(x in max(a, b, key=len) for x in (b, a, key=len))
.any(x in max(a, b, key=len) for x in min(b, a, key=len))
(raté le min).Peut-être un peu plus paresseux:
la source
any
peut donc revenir tôt, alors que votre version doit construire toute la liste à partir de la compréhension avant deany
pouvoir l'utiliser. La réponse de @ user89788 est légèrement meilleure car les doubles parenthèses ne sont pas nécessairesPensez à ce que dit réellement le code!
Cela devrait probablement l'expliquer. :) Python implémente apparemment "paresseux ou", ce qui ne devrait pas surprendre. Il exécute quelque chose comme ceci:
Dans le premier exemple,
x == 1
ety == 2
. Dans le deuxième exemple, c'est l'inverse. C'est pourquoi il renvoie des valeurs différentes en fonction de leur ordre.la source
Version golf code. Envisagez d'utiliser un ensemble s'il est logique de le faire. Je trouve cela plus lisible qu'une compréhension de liste.
la source
1 ligne sans liste de compréhension.
la source
Le mieux que j'ai pu trouver:
la source
En python 3, nous pouvons commencer à utiliser l'astérisque décompresser. Étant donné deux listes:
Edit: incorporez la suggestion d'alcanen
la source
Lorsque vous pensez "vérifier si a in b", pensez à des hachages (dans ce cas, des ensembles). Le moyen le plus rapide consiste à hacher la liste que vous souhaitez vérifier, puis à y archiver chaque élément.
C'est pourquoi la réponse de Joe Koberg est rapide: la vérification de l'intersection des ensembles est très rapide.
Cependant, lorsque vous n'avez pas beaucoup de données, la création d'ensembles peut être une perte de temps. Ainsi, vous pouvez faire un ensemble de la liste et vérifier simplement chaque élément:
Lorsque le nombre d'articles que vous souhaitez vérifier est petit, la différence peut être négligeable. Mais vérifiez beaucoup de chiffres par rapport à une grande liste ...
tests:
vitesses:
La méthode qui est toujours rapide est de faire un ensemble (de la liste), mais l'intersection fonctionne le mieux sur les grands ensembles de données!
la source
Dans certains cas (par exemple, des éléments de liste uniques), les opérations de définition peuvent être utilisées.
Ou, en utilisant set.isdisjoint () ,
la source
Cela le fera en une seule ligne.
la source
J'ai rassemblé plusieurs des solutions mentionnées dans d'autres réponses et dans des commentaires, puis j'ai effectué un test de vitesse.
not set(a).isdisjoint(b)
s'est avéré être le plus rapide, il n'a pas non plus beaucoup ralenti lorsque le résultat a étéFalse
.Chacune des trois exécutions teste un petit échantillon des configurations possibles de
a
etb
. Les temps sont en microsecondes.la source
Je dois dire que ma situation n'est peut-être pas celle que vous recherchez, mais elle peut fournir une alternative à votre réflexion.
J'ai essayé la méthode set () et any () mais j'ai toujours des problèmes de vitesse. Je me suis donc souvenu que Raymond Hettinger avait dit que tout en python est un dictionnaire et utilisez dict quand vous le pouvez. Voilà donc ce que j'ai essayé.
J'ai utilisé un defaultdict avec int pour indiquer des résultats négatifs et j'ai utilisé l'élément dans la première liste comme clé pour la deuxième liste (convertie en defaultdict). Parce que vous avez une recherche instantanée avec dict, vous savez immédiatement si cet élément existe dans le defaultdict. Je sais que vous ne changez pas toujours la structure des données pour votre deuxième liste, mais si vous le pouvez dès le départ, alors c'est beaucoup plus rapide. Vous devrez peut-être convertir list2 (liste plus grande) en un defaultdict, où clé est la valeur potentielle que vous souhaitez vérifier à partir d'une petite liste, et la valeur est soit 1 (hit) ou 0 (aucun hit, par défaut).
la source
Facile.
la source
a
est dans la listeb
.