以子列表的形式获取列表的所有可能组合

Dav*_*ker 5 python combinations combinatorics python-itertools

我想知道是否有人可以帮助完成以下任务:当顺序无关紧要时,如何将列表的所有组合拆分为子列表?

假设我有一个包含 4 个项目的列表:

import itertools as it

a = [1, 2, 3, 4]
print(list(it.combinations(a, 2)))
Run Code Online (Sandbox Code Playgroud)

这会给我一个包含 6 个可能对的列表:

[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
Run Code Online (Sandbox Code Playgroud)

如何制作(用它?或任何其他方式)一组[1, 2, 3, 4]以任何顺序包含原始序列的列表?因此,对于此示例,它将包含三个子列表:

 [(1, 2), (3, 4)]
 [(1, 3), (2, 4)]
 [(1, 4), (2, 3)]
Run Code Online (Sandbox Code Playgroud)

更新:一个小的澄清:换句话说,当 n 元组中的顺序无关紧要时,我需要获取所有 n 元组集,以便它们的成员包含原始列表的所有人口。因此[(1, 2), (3, 4)]可以,但[(2, 1), (3, 4)]如果我们忽略顺序,则不需要,因为它与第一组相同。

UPDATE2:因此对于长度为 6 的列表和大小为 2 的块,此fun函数应按如下方式工作:

import itertools as it
a = [1, 2, 3, 4, 5, 6,]
r = 2

# fun(a,r):
# OUT:
# [
#    (1, 2), (3, 4), (5, 6)
#    (1, 3), (2, 4), (5, 6),
#    (1, 4), (2, 3), (5, 6),
#    (1, 5), (2, 3), (4, 6),
#    (1, 6), (2, 3), (4, 5),
#  ]
Run Code Online (Sandbox Code Playgroud)

Sun*_*tha 2

只是zip组合,与其相反,并且只取结果列表的前半部分

>>> import itertools as it
>>> lst = [1, 2, 3, 4]
>>> r = len(lst)//2
>>> combs = list(it.combinations(lst, r))
>>> list(it.islice(zip(combs, reversed(combs)), len(combs)//2))
[((1, 2), (3, 4)), ((1, 3), (2, 4)), ((1, 4), (2, 3))]
Run Code Online (Sandbox Code Playgroud)