Python -Интеграция нескольких списков?
Я играю с 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]
Ответы
Ответ 1
для 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]
и размера списка, если у python нет встроенной проверки для него, как
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])
>>>
Ответ 2
set.intersection(*map(set,d))
Ответ 3
@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
Ответ 4
Лямбда уменьшить.
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])