взятие пересечения N-many перечисляет в Python

что самый легкий путь состоит в том, чтобы взять пересечение списков N-many в Python?

если у меня есть два списка a и b, я знаю, что могу сделать:

a = set(a)
b = set(b)
intersect = a.intersection(b)

но я хочу сделать что-то как a и b и c и d и... для произвольного набора списков (идеально, не преобразовывая в набор сначала, но если это - самое легкое / самый эффективный путь, я могу иметь дело с этим.)

Т.е. Я хочу записать, что функция пересекается (*args), который сделает это для произвольно многих наборов эффективно. Что самый легкий путь состоит в том, чтобы сделать это?

Править: Мое собственное решение, уменьшают (set.intersection, [a, b, c]) - который хорош?

спасибо.

7
задан 1 June 2010 в 20:57
поделиться

3 ответа

Это работает для 1 или более списков. Случай с 0 списками не так прост, потому что он должен вернуть набор, содержащий все возможные значения.

def intersection(first, *others):
    return set(first).intersection(*others)
13
ответ дан 6 December 2019 в 11:46
поделиться
lists = [[5,4,3], [4,2], [6,2,3,4]]

try:
    # the following line makes one intersection too much, but I don't think
    # this hurts performance noticably.
    intersected = set(lists[0]).intersection(*lists)
except ValueError:
    # no lists[0]
    intersected = set()

print intersected         # set([4])

Множества могут пересекаться с любым итеративным, нет необходимости сначала преобразовать его в набор.

2
ответ дан 6 December 2019 в 11:46
поделиться

Это работает с одним или несколькими списками и не использует несколько параметров:

>>> def intersection(*listas):
...     return set(listas[0]).intersection(*listas[1:]) 
...     
>>> intersection([1,2,3,4],[4,5,6],[2,4,5],[1,4,8])
set([4])
>>> intersection([1,2,3,4])
set([1, 2, 3, 4])
>>> 

В любом случае не уверен, что это лучше, чем другие ответы.

2
ответ дан 6 December 2019 в 11:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: