2010-10-04 2 views
36

Я играю с питоном, и я в состоянии получить пересечение двух списков:Python -Интеграция нескольких списков?

result = set(a).intersection(b) 

Теперь, если d список, содержащий a и b и третий элемент c, есть ли встроенная функция для поиска пересечение всех трех списков внутри d? Так, например,

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

, то результат должен быть

[3,4] 

ответ

33

для 2.4, вы можете просто определить функцию пересечения.

def intersect(*d): 
    sets = iter(map(set, d)) 
    result = sets.next() 
    for s in sets: 
     result = result.intersection(s) 
    return result 

для новых версий Python:

метод пересечения принимает произвольное количество аргументов

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

в качестве альтернативы, вы можете пересечь первый сет с собой, чтобы избежать нарезки список и копия:

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

Я не совсем уверен, что было бы более эффективным и есть ощущение, что это будет зависеть от размера d[0] и размера списка, если питон не имеет встроенную проверку на нее, как

if s1 is s2: 
    return s1 

в метод пересечения.

>>> 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: It дает me 'AttributeError: объект« list »не имеет атрибута« пересечение », если я это сделаю. Я что-то упускаю? – Legend

+0

@Legend. вы должны сначала сопоставить его с набором. Я как-то упустил тот факт, что они были списками.После этого вы можете просто передать списки (или любые другие итерабельные) методу 'intersection' – aaronasterling

+0

@AaronMcSmooth: На самом деле, не знаю, почему, но я получаю эту ошибку независимо от того, какое решение я пытаюсь:' TypeError: intersection() принимает ровно один аргумент (3 данный) ' – Legend

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

Не уверен, что здесь не так. Теперь это дает мне: 'TypeError: intersection() принимает ровно один аргумент (2 заданный)' – Legend

+0

@Legend, в какую версию вы используете python? меня устраивает. – aaronasterling

+0

@AaronMcSmooth: 2.4.3? – Legend

2

Lambda уменьшить.

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

вам нужен список наборов, это не будет означать, что «пересечение дескрипторов требует набора», – tj89

2

@ user3917838

Приятные и простой, но нуждается в отливке, чтобы сделать его работу и дать список в качестве результата. Он должен выглядеть следующим образом:

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

где:

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

И результата:

[3, 4]

По крайней мере, в Python 3.4