我有一个列表说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
所有项目的组合答案 0 :(得分:1)
您可以应用powerset
功能获取子集组合并过滤结果:
>>> lis1 = [1,2,3]
>>> lis2 = [[1,2],[2,3],[3],[1],[2]]
>>> filter(lambda s: set(sum(s,[])) == set(lis1), powerset(lis2))
[([1, 2], [2, 3]),
([1, 2], [3]),
([2, 3], [1]),
([1, 2], [2, 3], [3]),
([1, 2], [2, 3], [1]),
([1, 2], [2, 3], [2]),
([1, 2], [3], [1]),
([1, 2], [3], [2]),
([2, 3], [3], [1]),
([2, 3], [1], [2]),
([3], [1], [2]),
([1, 2], [2, 3], [3], [1]),
([1, 2], [2, 3], [3], [2]),
([1, 2], [2, 3], [1], [2]),
([1, 2], [3], [1], [2]),
([2, 3], [3], [1], [2]),
([1, 2], [2, 3], [3], [1], [2])]
如果您不希望在结果子集中出现重复元素,请改用:
>>> filter(lambda s: sorted(sum(s,[])) == sorted(lis1), powerset(lis2))
[([1, 2], [3]), ([2, 3], [1]), ([3], [1], [2])]
两种方法都使用sum(s, [])
展平嵌套列表,然后使用set
(全部存在,忽略重复项)或sorted
(全部存在,完全相同)将这些列表与原始元素进行比较计数)。