【发布时间】:2014-07-28 09:22:50
【问题描述】:
我有一个列表说lis1 = [1,2,3]
和上面列表的子集列表说
lis2 = [[1,2],[2,3],[3],[1],[2]]
我想生成 lis2 的所有组合,以便 lis1 的所有项目都应该出现在组合中。
例如。这是一个有效的组合
一个这样的组合是[[1,2],[2,3]](lis1 的所有项目,即[1,2,3] 都存在于其中)
这不是
[[1,2],[1],[2]] # (3 is not present in it)
我所做的是通过这个函数生成 lis2 的 powerset
from itertools import chain, combinations
def powerset(iterable):
s = list(iterable)
return chain.from_iterable(combinations(s, r) for r in range(1,len(s)+1))
但很明显,返回的集合包含类型的组合
[[1,2],[1],[2]] # (3 is not present in it)
如何检查包含 lis1 的所有项目的组合
【问题讨论】:
-
“一个这样的组合是
[[1,2],[2,3]](lis1的所有项目,即[1,2]都存在于其中)”——你是什么意思?它缺少3,它存在于lis1。 -
那么,列表的列表可以包含重复元素吗?重复子集呢?是否允许
[[1,2],[3],[1,2]]?另外,顺序重要吗? -
@tobias_k 不允许重复元素,顺序无关紧要
-
不允许重复作为子列表 [1,2] 不等于 [2,3] - 但 2 包含在 [1,2] 和 [2,3] 中。您上面的示例是 [[1,2],[3],[1,2]] 是不允许的,因为它有 2 个相等的子列表 [1,2] 和 [1,2]。这也不是有效的,例如 [[1,2],[3],[2,1]] (因为顺序无关紧要,因此 [1,2],[2,1] 被视为相等,这些情况将永远不会在上面的 lis2 中退出)
-
哎呀,对不起,我已经在写答案了,完全忘记了我在评论中问的是什么。很抱歉造成混乱。
标签: python python-2.7 set powerset