将列表拆分为所有组合

时间:2017-10-02 12:34:16

标签: python itertools

我知道许多帖子都有类似的问题,并且已经通过其中许多问题。但是,我无法做我需要的事。

我有列表L = [0,1,2,3,4,5],我希望将其拆分为一对元组。例如:

[(0,1,2),(3,4,5)]
[(0,1,3),(2,4,5)]
[(0,1,4),(2,4,5)]
...

每个元组需要包含原始列表中的一半元素(在本示例中为3个中的3个)。解决方案需要使用3个元素生成元组的每个组合。

我可以使用

轻松找到列表中的所有可能元组
list(itertools.combinations(L, 3))

[(0, 1, 2), (0, 1, 3), (0, 1, 4), (0, 1, 5), (0, 2, 3), (0, 2, 4), ...]

itertools是否为此提供了任何工作方式?

1 个答案:

答案 0 :(得分:4)

可能有更多高性能的解决方案可以避免另一半的列表完全额外迭代,但这应该是可以忽略不计的:

l = [[x, tuple(y for y in L if y not in x)] for x in combinations(L, 3)]
[[(0, 1, 2), (3, 4, 5)],
 [(0, 1, 3), (2, 4, 5)],
 [(0, 1, 4), (2, 3, 5)],
 [(0, 1, 5), (2, 3, 4)],
 [(0, 2, 3), (1, 4, 5)],
 [(0, 2, 4), (1, 3, 5)],
 [(0, 2, 5), (1, 3, 4)],
 [(0, 3, 4), (1, 2, 5)],
 [(0, 3, 5), (1, 2, 4)],
 [(0, 4, 5), (1, 2, 3)],
 [(1, 2, 3), (0, 4, 5)],
 [(1, 2, 4), (0, 3, 5)],
 [(1, 2, 5), (0, 3, 4)],
 [(1, 3, 4), (0, 2, 5)],
 [(1, 3, 5), (0, 2, 4)],
 [(1, 4, 5), (0, 2, 3)],
 [(2, 3, 4), (0, 1, 5)],
 [(2, 3, 5), (0, 1, 4)],
 [(2, 4, 5), (0, 1, 3)],
 [(3, 4, 5), (0, 1, 2)]]

这取决于原始列表中是否存在重复项。否则,您必须使用索引。以下修改使用相同的方法,但使用组合的列表索引,因此可以处理原始列表中的重复项:

indexes = ((x, (y for y in L if y not in x)) for x in combinations(range(len(L)), 3))
l = [[tuple(L[a] for a in A), tuple(L[b] for b in B)] for A, B in indexes]