Solución:
set.intersection(*map(set,d))
para 2.4, simplemente puede definir una función de intersección.
def intersect(*d):
sets = iter(map(set, d))
result = sets.next()
for s in sets:
result = result.intersection(s)
return result
para versiones más nuevas de python:
el método de intersección toma una cantidad arbitraria de argumentos
result = set(d[0]).intersection(*d[1:])
alternativamente, puede cruzar el primer conjunto consigo mismo para evitar cortar la lista y hacer una copia:
result = set(d[0]).intersection(*d)
No estoy realmente seguro de cuál sería más eficiente y tengo la sensación de que dependería del tamaño del d[0]
y el tamaño de la lista a menos que Python tenga una verificación incorporada como
if s1 is s2:
return s1
en el método de intersección.
>>> 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])
>>>
@ usuario3917838
Agradable y simple, pero necesita un casting para que funcione y dar una lista como resultado. Debería verse así:
list(reduce(set.intersection, [set(item) for item in d ]))
dónde:
d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
Y el resultado es:
[3, 4]
Al menos en Python 3.4