Подтвердить что ты не робот

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]
4b9b3361

Ответ 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])