python - 使用 Python 组合列表中的集合
问题描述
我面临着相当简单但对我来说相当有问题的事情,因为我无法通过这个。到目前为止,我已经能够识别 Python 中的某些工具(即来自 itertools 的链、组合、排列和产品)。问题是这些对我没有多大帮助,或者可能是有一种方法可以正确使用它们来解决问题。
问题是:
假设我有一个集合列表(或列表列表):
[(1,), (2,), (3,), (1,2), (2,3)]
我想要实现的是获得这些集合的某种组合,但结果不能组合每个集合的内部主体,即它不能产生这样的东西:
[(1,2,3), (2,3,1)]
因为集合必须分开。所以正确的结果应该是这样的:
[[(1,),(2,),(1,2)], [(1,), (2,3)]]
因此,正如您所看到的,它会在列表中生成一组列表,因为整个想法是沿着组合保存这些集合。最好提供包含集合的最大长度列表,即长度从 1 到 3 的所有组合。
Itertools 很好,但它确实破坏了集合,使它们无法区分。我的想法是可能组合索引列表,其中每个索引都代表一个集合,即
[0,1,2,3,4] -> [(0,2,3), (0,1)] -> which translates into -> [[(1,),(3,),(1,2)], [(1,), (2,)]]
我希望你能知道我想在这里得到什么。
解决方案
如果我正确理解您的问题,您需要列表项的所有排列,而不是组合单个列表项。而对于长度 1 到“外部列表长度”的排列。
在这种情况下,以下可能会起作用:
import itertools as it
a = [(1,), (2,), (3,), (1,2), (2,3)]
perms = it.chain.from_iterable(it.permutations(a, n) for n in range(len(a)))
perms
将是一个可迭代的(list
如果需要,可以将其转换为),并将产生 206 个元素,每个元素的“长度”为 1、2、3、4 或 5(= len(a)
,最大值)的可迭代。同样,如果您希望这些元素成为列表,也可以转换它们(事先或在需要的地方)。
如果您想要示例中的结果(元组列表列表),请使用例如:
list(it.chain([list(p) for p in it.permutations(a, n)] for n in range(len(a))))
推荐阅读
- excel - 为什么 Excel SUMIF 函数返回 #ERROR
- java - EntityManager 的异常行为
- r - R:检查函数是否已作为参数提供给另一个函数的正确方法
- c - 在不使用编译器扩展的情况下定义类型检查 containerof 宏
- swift - 带有列表的选项卡视图抛出错误 UITableView 被告知在不位于视图层次结构中的情况下布局其可见单元格和其他内容
- javascript - 元素 UI - 未知的自定义元素:
- 您是否正确注册了组件? - macos - 来自 Transporter 的错误,“未能获取应用程序的捆绑包 ID”
- mongodb - 在 MongoDB Sharded Cluster 查询中是否可能存在跳过/限制的重复项
- python - 在python中进行多次调度的简单方法?(没有外部库或类构建?)
- c# - Regular expression for US phone number