2012-06-02 6 views
3

I определяют пересечение двух списков следующим образом:Пересечение переменного количества списков

def intersect(a, b): 
    return list(set(a) & set(b)) 

Для трех аргументов он будет выглядеть так:

def intersect(a, b, c): 
    return (list(set(a) & set(b) & set(c)) 

Могу ли я обобщить эту функцию переменного количества списков ?

вызов будет выглядеть, например, как:

>> intersect([1, 2, 2], [2, 3, 2], [2, 5, 2], [2, 7, 2]) 
[2] 

EDIT: Python может достичь только это таким образом?

intersect([ 
      [1, 2, 2], [2, 3, 2], [2, 5, 2], [2, 7, 2] 
     ]) 
[2] 
+0

Возможный дубликат [как лучше всего найти пересечение нескольких множеств в python?] (Http://stackoverflow.com/questions/2541752/how-best-do-i-find-the-intersection-of- multiple-sets-in-python) – jamylak

+0

Возможный дубликат [Python -Incessection нескольких списков?] (http://stackoverflow.com/questions/3852780/python-intersection-of-multiple-lists) – jamylak

+0

Почему это было поддержано? ? Это точный дубликат. – jamylak

ответ

14

Используйте *-list-to-argument operator и вместо пользовательского использования функции set.intersection:

>>> lists = [[1, 2, 2], [2, 3, 2], [2, 5, 2], [2, 7, 2]] 
>>> list(set.intersection(*map(set, lists))) 
[2] 

Если вы хотите логику список в настройке, в-список внутри функции, вы можете сделать это следующим образом :

def intersect(lists): 
    return list(set.intersection(*map(set, lists))) 

Если вы предпочитаете intersect() принимать произвольное число аргументов, а не одну, используйте вместо этого:

def intersect(*lists): 
    return list(set.intersection(*map(set, lists))) 
+3

Вам действительно не нужно настраивать каждый список, только первый - 'set (lists [0]). Пересечение (* lists)' будет делать то же самое. Не то, чтобы это была хорошая идея, поскольку она несколько менее читаема, но она может быть немного более эффективной для очень большого количества списков. – lvc

+0

@ThiefMaster Python может принимать только аргумент в виде списка? не может ли он принимать переменное количество аргументов? – xralf

+3

@xralf: Если вы хотите, чтобы 'intersect()' принимал несколько аргументов, используйте 'def intersect (* lists)'. Тогда 'lists' будет списком, содержащим все позиционные аргументы. – ThiefMaster

0
def intersect(*lists): 
    if(len(lists) <=1): 
     return lists[0] 

    result = lists[0] 
    for i in range(1, len(lists)): 
     result = set(result) & set(lists[i]) 

    return list(result) 

Вызов функции так же, как это ...

intersect([1,2],[2,3],[2,4]) 

Оставив все санитарными вас.

+0

Спасибо. Мне тоже нравится это решение. – xralf

+0

Это не очень pythonic, итерация по списку с использованием индекса никогда не должна использоваться в Python. – jamylak

Смежные вопросы