我知道许多帖子都有类似的问题,并且已经通过其中许多问题。但是,我无法做我需要的事。
我有列表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
是否为此提供了任何工作方式?
答案 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]