Python - пересечение нескольких списков? - PullRequest
46 голосов
/ 04 октября 2010

Я играю с питоном и могу получить пересечение двух списков:

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]

Ответы [ 4 ]

57 голосов
/ 04 октября 2010
set.intersection(*map(set,d))
43 голосов
/ 04 октября 2010

для 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])
>>> 
4 голосов
/ 12 октября 2016

@ 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

1 голос
/ 17 августа 2015

Лямбда-редуктор.

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])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...