使用Python在列表中组合集合

2024-05-23 17:31:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我面对的是一件很简单的事情,但对我来说,这是一件很有问题的事情,因为我无法度过难关。到目前为止,我已经能够识别Python中的某些工具(即来自itertools的链、组合、置换和产品)。问题是这些对我没有多大帮助,或者可能有一种方法可以正确地使用它们来解决问题

问题是:

假设我有一个集合列表(或列表列表):

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

我想要实现的是得到这些集合的某些组合,但结果不能组合每个集合的内部,即。E它不能产生这样的东西:

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

因为两组必须分开。所以正确的结果应该是这样的:

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

如你所见,它会在一个列表中产生一组列表,因为整个想法是沿着组合保存这些集合。最好提供包含集合的最大长度列表,即。E长度从1到3的所有组合

Itertools很不错,但它确实破坏了布景,使布景变得平淡无奇。我的想法是把索引列表组合起来,每个索引代表一个集合,即。e

[0,1,2,3,4] -> [(0,2,3), (0,1)] -> which translates into -> [[(1,),(3,),(1,2)], [(1,), (2,)]]

我希望你能知道我想在这里得到什么


Tags: 工具方法which列表产品代表事情解决问题
1条回答
网友
1楼 · 发布于 2024-05-23 17:31:11

如果我正确理解了您的问题,您希望列表项的所有排列,而不合并单个列表项。对于长度为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将是一个iterable(因此,如果需要,将其转换为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))))

相关问题 更多 >