web-dev-qa-db-fra.com

Python -Intersection de plusieurs listes?

Je joue avec python et je peux obtenir l'intersection de deux listes:

result = set(a).intersection(b)

Maintenant, si d est une liste contenant a et b et un troisième élément c, existe-t-il une fonction intégrée pour trouver l'intersection de tous les trois listes dans 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]
48
Legend

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 une quantité arbitraire d'arguments

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

alternativement, vous pouvez couper 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 plus efficace et j'ai le sentiment que cela dépend de la taille du d[0] et la taille de la liste sauf si python a une vérification intégrée comme

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])
>>> 
44
aaronasterling
set.intersection(*map(set,d))

@ user3917838

Agréable et simple mais a besoin d'un casting pour le faire fonctionner et donner une liste en conséquence. Cela devrait ressembler à:

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

où:

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

4
Bartek

Lambda réduire.

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])
1
user3917838