【问题标题】:return combinations having all element present返回包含所有元素的组合
【发布时间】: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


【解决方案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(全部存在,完全相同的计数)将它们与原始元素进行比较。

【讨论】:

  • 我必须得到 lis2 而不是 lis1 的组合。如果按照上述程序进行,我必须额外检查过滤器函数返回的子项目(单行返回的单个项目)也必须与 lis2 中的项目匹配。
  • @AnuragSharma 我编辑了我的答案以更适合您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 2021-10-02
  • 2010-09-12
相关资源
最近更新 更多