76 votes

Python -Intersection de plusieurs listes ?

Je joue avec Python et je suis capable d'obtenir l'intersection de deux listes :

result = set(a).intersection(b)

Maintenant si d est une liste contenant a y b et un troisième élément c Est-ce qu'il y a une fonction intégrée pour trouver l'intersection des trois listes à l'intérieur de la liste ? d ? Ainsi, par exemple,

d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]

alors le résultat devrait être

[3,4]

94voto

IfLoop Points 59461
set.intersection(*map(set,d))

1 votes

Je ne sais pas ce qui ne va pas. Maintenant ça me donne : TypeError: intersection() takes exactly one argument (2 given)

1 votes

Merci beaucoup. +1 pour cela. Je n'ai juste pas pu l'utiliser à cause de ma version de Python :(

2 votes

Si el d La variable peut avoir une longueur de zéro. set.intersection soulèvera un TypeError exception. Je recommande d'attraper cette exception et de retourner set() (un ensemble vide) à la place dans ce cas dégénéré. C'est mieux que de vérifier le len de d à l'avance car il peut s'agir d'un générateur.

63voto

aaronasterling Points 25749

Pour 2.4, vous pouvez simplement définir une fonction d'intersection.

def intersect(*d):
    sets = iter(map(set, d))
    result = sets.next()
    for s in sets:
        result = result.intersection(s)
    return result

pour les nouvelles versions de python :

la méthode d'intersection prend un nombre arbitraire d'arguments

result = set(d[0]).intersection(*d[1:])

Alternativement, vous pouvez intersecter le premier ensemble avec lui-même pour éviter de découper la liste et de faire une copie :

result = set(d[0]).intersection(*d)

Je ne suis pas vraiment sûr de ce qui serait le plus efficace et j'ai l'impression que cela dépendrait de la taille de l'appareil. d[0] et la taille de la liste, à moins que python n'ait une vérification intégrée pour cela, comme par exemple

if s1 is s2:
    return s1

dans la méthode d'intersection.

>>> d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
>>> set(d[0]).intersection(*d)
set([3, 4])
>>> set(d[0]).intersection(*d[1:])
set([3, 4])
>>>

11voto

Bartek Points 91

@user3917838

Sympathique et simple mais il faut un peu de casting pour le faire fonctionner et donner une liste comme résultat. Cela devrait ressembler à ça :

list(reduce(set.intersection, [set(item) for item in d ]))

donde:

d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]

Et le résultat est :

[3, 4]

Au moins dans Python 3.4

10voto

Vous pouvez obtenir l'intersection d'un nombre arbitraire d'ensembles en utilisant set.intersection(set1, set2, set3...) . Il vous suffit donc de convertir vos listes en ensembles, puis de les transmettre à cette méthode comme suit :

d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]  
set.intersection(*[set(x) for x in d])  

résultat :

{3, 4}

4voto

Réduction lambda.

from functools import reduce #you won't need this in Python 2
l=[[1, 2, 3, 4], [2, 3, 4], [3, 4, 5, 6, 7]]
reduce(set.intersection, [set(l_) for l_ in l])

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