a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c
sortie réelle: [1,3,5,6]
sortie attendue:[1,3,5]
Comment réaliser une opération booléenne ET (intersection de listes) sur deux listes?
python
arrays
intersection
csguy11
la source
la source
a and b
fonctionne comme l' instruction suivante de la documentation le mentionne: " L'expression est d'x and y
abord évaluéex
; si ellex
est fausse, sa valeur est renvoyée; sinon, elley
est évaluée et la valeur résultante est renvoyée. "Réponses:
Si l'ordre n'est pas important et que vous n'avez pas à vous soucier des doublons, vous pouvez utiliser l'intersection définie:
la source
a = [1,1,2,3,4,5]
etb = [1,1,3,5,6]
ensuite l'intersection est,[1,1,3,5]
mais par la méthode ci-dessus, il n'en résultera qu'une seule,1
c'est-à-dire[1, 3, 5]
quelle sera la façon d'écrire pour le faire alors?intersection
est généralement compris comme étant basé sur un ensemble . Vous recherchez un animal légèrement différent - et vous devrez peut-être le faire manuellement en triant chaque liste et en fusionnant les résultats - et en gardant des doublons dans la fusion.Utiliser des listes de compréhension est assez évident pour moi. Je ne suis pas sûr de la performance, mais au moins les choses restent des listes.
[x for x in a if x in b]
Ou "toutes les valeurs x qui sont dans A, si la valeur X est dans B".
la source
b
un set et vous aurez O (n)Si vous convertissez la plus grande des deux listes en un ensemble, vous pouvez obtenir l'intersection de cet ensemble avec n'importe quel itérable en utilisant
intersection()
:la source
list(set(a) & set(b))
Faites un ensemble à partir du plus grand:
Ensuite,
fera ce que vous voulez (préserver
b
l'ordre, pasa
- ne peut pas nécessairement préserver les deux ) et le faire rapidement . (L'utilisationif x in a
comme condition dans la liste de compréhension fonctionnerait également et éviterait d'avoir à construire_auxset
, mais malheureusement pour les listes de longueur substantielle, ce serait beaucoup plus lent).Si vous souhaitez que le résultat soit trié, plutôt que de conserver l'ordre des listes, une méthode encore plus soignée pourrait être:
la source
Voici du code Python 2 / Python 3 qui génère des informations de synchronisation pour les méthodes basées sur des listes et sur des ensembles pour trouver l'intersection de deux listes.
Les algorithmes de compréhension de liste pure sont O (n ^ 2), car
in
sur une liste est une recherche linéaire. Les algorithmes basés sur les ensembles sont O (n), car la recherche d'ensembles est O (1), et la création d'ensembles est O (n) (et la conversion d'un ensemble en liste est également O (n)). Ainsi, pour des n suffisamment grands, les algorithmes basés sur les ensembles sont plus rapides, mais pour les petits n, les frais généraux de création des ensembles les rendent plus lents que les algorithmes de compilation de liste pure.production
Généré à l'aide d'une machine monocœur à 2 GHz avec 2 Go de RAM exécutant Python 2.6.6 sur une version Debian de Linux (avec Firefox fonctionnant en arrière-plan).
Ces chiffres ne sont qu'un guide approximatif, car les vitesses réelles des différents algorithmes sont affectées différemment par la proportion d'éléments qui se trouvent dans les deux listes de sources.
la source
Devrait fonctionner comme un rêve. Et, si vous le pouvez, utilisez des ensembles au lieu de listes pour éviter tout changement de ce type!
la source
Une manière fonctionnelle peut être réalisée en utilisant
filter
etlambda
opérateur.Edit: il filtre x qui existe à la fois dans list1 et list, la différence définie peut également être obtenue en utilisant:
Edit2: python3
filter
renvoie un objet filtre, l'encapsulant aveclist
renvoie la liste de sortie.la source
list(filter(lambda x:x in list1, list2))
pour l'obtenir sous forme de liste.Ceci est un exemple lorsque vous avez besoin que chaque élément du résultat apparaisse autant de fois qu'il le montre dans les deux tableaux.
la source
Il pourrait être en retard, mais je pensais juste que je devrais partager pour le cas où vous êtes obligé de le faire manuellement (montrer le travail - haha) OU lorsque vous avez besoin que tous les éléments apparaissent autant de fois que possible ou quand vous avez également besoin qu'il soit unique .
Veuillez noter que des tests ont également été écrits pour cela.
la source
Si, par booléen ET, vous voulez dire les éléments qui apparaissent dans les deux listes, par exemple l'intersection, alors vous devriez regarder Python
set
et lesfrozenset
types.la source
Vous pouvez également utiliser un compteur! Il ne conserve pas l'ordre, mais il prendra en compte les doublons:
la source