使用Python对列表中的集合进行组合

问题描述 投票:0回答:1

我正面临着一个相当简单但对我来说相当麻烦的事情,因为我不能通过这个。到目前为止,我已经能够识别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,)]]

我希望你能明白我想得到什么。

python set combinations
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))))
© www.soinside.com 2019 - 2024. All rights reserved.