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

2024-04-25 14:35:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想知道是否有人能帮忙完成以下任务: 当顺序无关紧要的时候,怎样才能得到一个列表可以分解成子列表的所有组合?在

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

import itertools as it

a = [1, 2, 3, 4]
print(list(it.combinations(a, 2)))

这将为我列出6种可能的配对:

^{pr2}$

如何利用它?或任何其他方式)一组包含原始[1, 2, 3, 4]顺序的列表?因此在本例中,它将包含三个子列表:

 [(1, 2), (3, 4)]
 [(1, 3), (2, 4)]
 [(1, 4), (2, 3)]

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

更新2: 因此,对于长度为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),
#  ]

Tags: 项目import利用列表顺序asitlist
3条回答

由于您需要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化,这将给我们一组lists,这些不能被转换成sets。然后你应该将lists转换为tuples

^{pr2}$

如果您需要一个listlist,那么您可以使用以下方法

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)]]
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)

也许这段代码可以帮助你的要求。在

只需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))]

相关问题 更多 >