2010-10-04 13 views
36

estoy jugando con Python y soy capaz de conseguir la intersección de dos listas:Python -Intersección de listas múltiples

result = set(a).intersection(b) 

Ahora bien, si d es una lista que contiene a y b y un tercer elemento c, ¿hay una función integrada para encontrar la intersección de las tres listas dentro de d? Así, por ejemplo,

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

continuación, el resultado debería ser

[3,4] 

Respuesta

33

de 2.4, sólo 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 

hay nuevas versiones de pitón:

el método de intersección tiene una cantidad arbitraria de argumentos

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

alternativa, puede intersectar el primer conjunto con sí mismo para evitar cortar el lista y hacer una copia:

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

no estoy realmente seguro de lo que sería más eficiente y tener una sensación de que sería dependerá del tamaño de la d[0] y el tamaño de la lista a menos pitón tiene un cheque incorporado por ella 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]) 
>>> 
+0

@AaronMcSmooth: Se da me 'AttributeError: el objeto 'list' no tiene atributo 'intersection'' si hago eso. ¿Me estoy perdiendo de algo? – Legend

+0

@Legend. Primero debes asignarlo a un conjunto. De alguna manera me perdí el hecho de que eran listas.Después de eso, puede pasar listas (o cualquier otra iterable) al método 'intersection' – aaronasterling

+0

@AaronMcSmooth: En realidad, no estoy seguro de por qué, pero obtengo este error sin importar la solución que intento:' TypeError: intersection() takes exactamente un argumento (3 dado) ' – Legend

40
set.intersection(*map(set,d)) 
+0

No estoy seguro de lo que está mal aquí. Ahora me da: 'TypeError: intersection() toma exactamente un argumento (dado 2)' – Legend

+0

@Legend, ¿en qué versión de python estás? esto funciona para mi. – aaronasterling

+0

@AaronMcSmooth: 2.4.3? – Legend

2

Lambda reducir.

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

requiere una lista de conjunto, esto fallaría diciendo que 'la intersección del descriptor requiere establecer' – tj89

2

@ user3917838

bonito y sencillo pero necesita un poco de fundición para hacerlo funcionar y dar una lista como resultado. Debe quedar como:

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

donde:

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

Y resultado es:

[3, 4]

Al menos en Python 3.4

Cuestiones relacionadas