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