我想知道是否有人可以帮助完成以下任务: 当顺序无关紧要时,如何将列表组合成多个子列表,从而获得所有组合?
假设我列出了4个项目:
import itertools as it
a = [1, 2, 3, 4]
print(list(it.combinations(a, 2)))
那将给我列出6对可能的配对:
[(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]
如何(以其他方式或其他方式)制作一组包含任意顺序的原始[1, 2, 3, 4]
序列的列表?因此,对于此示例,它将包含三个子列表:
[(1, 2), (3, 4)]
[(1, 3), (2, 4)]
[(1, 4), (2, 3)]
更新:
一点澄清:
换句话说,当一个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),
# ]
答案 0 :(得分:1)
仅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))]
答案 1 :(得分:0)
由于您需要“ a
”中的“余数”,因此可以使用set
差异
In [901]: [(c, tuple(set(a) - set(c))) for c in it.combinations(a, 2)]
Out[901]:
[((1, 2), (3, 4)),
((1, 3), (2, 4)),
((1, 4), (2, 3)),
((2, 3), (1, 4)),
((2, 4), (1, 3)),
((3, 4), (1, 2))]
但是,这为您提供了两倍于您需要的结果,因此要消除这些重复项,我们需要对结果集进行排序和set
进行分类,这将为我们提供一组list
,它们可以不会变成set
s。然后,您应该将list
转换为tuple
。
In [900]: {tuple(sorted((c, tuple(set(a) - set(c))))) for c in it.combinations(a, 2)}
Out[900]: {((1, 2), (3, 4)), ((1, 3), (2, 4)), ((1, 4), (2, 3))}
如果您需要list
中的list
中的tuple
,则可以使用以下
In [902]: s = {tuple(sorted((c, tuple(set_a - set(c))))) for c in it.combinations(a, 2)}
In [903]: [list(l) for l in s]
Out[903]: [[(1, 3), (2, 4)], [(1, 4), (2, 3)], [(1, 2), (3, 4)]]
答案 2 :(得分:0)
a = [1, 2, 3, 4]
choices = []
for i in range(len(a)):
for j in range(i+1, len(a)):
sub_a1 = (a[i], a[j])
sub_a2 = tuple(j for j in a if j not in sub_a1)
sub_a = sorted([sub_a1, sub_a2])
if sub_a not in choices:
choices.append(sub_a)
for k in choices:
print(k)
也许这段代码可以帮助您满足要求。