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 et b et un troisième élément de c, est-il une fonction intégrée pour trouver l'intersection de tous les trois listes à l'intérieur de 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]
40
demandé sur SilentGhost 2010-10-04 08:12:19

4 réponses

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 croiser le premier ensemble avec lui-même pour éviter de découper la liste et d'en 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 le sentiment que cela dépendrait de la taille du d[0] et de la taille de la liste à moins que python n'ait un intégré vérifiez-le 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])
>>> 
35
répondu aaronasterling 2010-10-04 04:49:25
set.intersection(*map(set,d))
46
répondu SingleNegationElimination 2010-10-04 04:18:50

@ user3917838

Agréable et simple, mais a besoin d'un casting pour le faire fonctionner et donner une liste en conséquence. Il 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 en Python 3.4

3
répondu Bartek 2016-10-12 09:12:13

Lambda réduire.

from functools import reduce #you won't need this in Python 2
reduce(set.intersection, [[1, 2, 3, 4], [2, 3, 4], [3, 4, 5, 6, 7]])
1
répondu 2015-08-17 16:33:46