返回具有所有元素的组合

时间:2014-07-28 09:22:51

标签: python python-2.7 set powerset

我有一个列表说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 个答案:

答案 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(全部存在,完全相同)将这些列表与原始元素进行比较计数)。