如何在 Python3.0 中找到子列表的子列表的交集?
How to find intersection of sublists of sublists in 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'!
从你的问题中不清楚你到底想做什么,但如果你想测试元素的存在(例如1
)在 任何子列表 中,您可以先展平 "super list",然后从该列表中创建一个集合。
我们可以一次性完成 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
您可以展平子列表并使用 set.intersection
:
获取它们的交集
>>> set.intersection(*[{x for lst in sub for x in lst} for sub in SuperList])
set([1, 3, 4])
想象一下这样的列表:
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'!
从你的问题中不清楚你到底想做什么,但如果你想测试元素的存在(例如1
)在 任何子列表 中,您可以先展平 "super list",然后从该列表中创建一个集合。
我们可以一次性完成 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
您可以展平子列表并使用 set.intersection
:
>>> set.intersection(*[{x for lst in sub for x in lst} for sub in SuperList])
set([1, 3, 4])