在 Python 中生成所有大小为 k 的子集(包含 k 个元素)

新手上路,请多包涵

我有一组值,想创建包含 2 个元素的所有子集的列表。

例如,源集 ([1,2,3]) 具有以下 2 元素子集:

 set([1,2]), set([1,3]), set([2,3])

有没有办法在 python 中做到这一点?

原文由 John Manak 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 452
2 个回答

好像你想要 itertools.combinations

 >>> list(itertools.combinations((1, 2, 3), 2))
[(1, 2), (1, 3), (2, 3)]

如果你想要集合,你必须明确地转换它们。如果您不介意使用可迭代对象而不是列表,并且您使用的是 Python 3,则可以使用 map

 >>> s = set((1, 2, 3))
>>> map(set, itertools.combinations(s, 2))
<map object at 0x10cdc26d8>

要一次查看所有结果,您可以将 map 的输出传递给 list 。 (在 Python 2 中, map 的输出自动是一个列表。)

 >>> list(map(set, itertools.combinations(s, 2)))
[{1, 2}, {1, 3}, {2, 3}]

但是,如果您知道您需要一个列表,那么列表理解会稍微好一些(h/t Jacob Bowyer ):

 >>> [set(i) for i in itertools.combinations(s, 2)]
[{1, 2}, {1, 3}, {2, 3}]

原文由 senderle 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是 {1, 2, 3}幂集 的子集(或任何包含所有二元素集的集合)。

请参阅 Python itertools 文档 并搜索术语“powerset”以获得此问题的一般答案。

原文由 Alex Reynolds 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题