如何在Python3.0中找到子列表的子列表?

时间:2017-07-07 10:06:29

标签: python list intersection

想象一下如下列表:

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'!

2 个答案:

答案 0 :(得分:0)

从你的问题中不清楚你究竟想要做什么,但是如果你想在中尝试测试存在元素(例如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

答案 1 :(得分:0)

您可以展平子列表并使用set.intersection

进行交叉
>>> set.intersection(*[{x for lst in sub for x in lst} for sub in SuperList])
set([1, 3, 4])