что самый легкий путь состоит в том, чтобы взять пересечение списков 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]) - который хорош?
спасибо.
Это работает для 1 или более списков. Случай с 0 списками не так прост, потому что он должен вернуть набор, содержащий все возможные значения.
def intersection(first, *others):
return set(first).intersection(*others)
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])
Множества могут пересекаться с любым итеративным, нет необходимости сначала преобразовать его в набор.
Это работает с одним или несколькими списками и не использует несколько параметров:
>>> 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])
>>>
В любом случае не уверен, что это лучше, чем другие ответы.