Как найти пересечение подсписков подсписков в Python3.0?

Представьте себе список вроде:

SuperList = [[[1,2,3],[1,2,4]],[[6,3,1],[9,0,4]]]

Как видите, у меня есть подсписок внутри подсписка. Как я могу найти пересечение этих подсписков? В этом случае ответ 1,3 и 4. Моя цель - добавить все элементы, которые появляются хотя бы один раз в каждом подсписке, в новый список (не имеет значения, появляется ли он во всех подсписках одного подсписка)

Пробовал с set.intersection, но постоянно получаю

'unhashable type: 'list''

или при попытке раскрутить список я получаю

'can't use the starred expression here'!

person George Kladis    schedule 07.07.2017    source источник
comment
Вы пытаетесь выяснить, встречается ли где-либо 1, или пытаетесь найти точный подсписок, в котором встречается?   -  person randomir    schedule 07.07.2017


Ответы (2)


Вы можете сгладить подсписки и пересечь их, используя set.intersection:

>>> set.intersection(*[{x for lst in sub for x in lst} for sub in SuperList])
set([1, 3, 4])
person Moses Koledoye    schedule 07.07.2017
comment
Моисей ты Моисей? Спасибо чувак! Я действительно ценю! Я работал над этим 10 15 часов, и в конце концов это было так просто! Начинающий программист борется, я думаю! Спасибо еще раз! - person George Kladis; 07.07.2017

Из вашего вопроса неясно, что именно вы пытаетесь сделать, но если вы пытаетесь проверить наличие элемента (например, 1) в любом из подсписков , вы можете сначала сгладить «суперсписок», а затем сделать набор из этого списка.

Мы можем сделать это за один раз с помощью flatset():

def flatset(lst):
    try:
        return set(lst)
    except TypeError:
        s = set()
        for item in lst:
            s.update(flatset(item))
        return s

Например:

>>> superlist = [[[1,2,3],[1,2,4]],[[6,3,1],[9,0,4]]]
>>> flatset(superlist)
set([0, 1, 2, 3, 4, 6, 9])
>>> 1 in flatset(superlist)
True
person randomir    schedule 07.07.2017