принимая пересечение N-много списков в Python - PullRequest
7 голосов
/ 02 июня 2010

Какой самый простой способ пересечения N-многих списков в Python?

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

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

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

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

РЕДАКТИРОВАТЬ: Мое собственное решение - уменьшить (set.intersection, [a, b, c]) - это хорошо?

спасибо.

Ответы [ 3 ]

13 голосов
/ 02 июня 2010

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

def intersection(first, *others):
    return set(first).intersection(*others)
2 голосов
/ 02 июня 2010
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 голосов
/ 02 июня 2010

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

>>> 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])
>>> 

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...