【问题标题】:Two Combination Lists from One List一个列表中的两个组合列表
【发布时间】:2015-10-27 06:44:06
【问题描述】:

我是 python 初学者。我正在尝试从一个列表中获取两个组合列表。

例如,我有一个列表:

c = [1, 2, 3, 4]

我想使用每四个项目来填充两个列表来获得所有可能的组合。会有((2^4)/2)-1 的可能性。

c1 = [1]  c2 = [2, 3, 4]
c1 = [2]  c2 = [1, 3, 4]
c1 = [3]  c2 = [2, 3, 4]
c1 = [4]  c2 = [1, 2, 3]
c1 = [1, 2]  c2 = [3, 4]
c1 = [1, 3]  c2 = [2, 4]
c1 = [1, 4]  c2 = [2, 3]

通常适用于此类任务的函数是itertools,但我无法选择itertools.combination 生成的列表数量。

该功能只允许我选择每个列表应该有多少项目。

例如,如果我尝试以下功能,

print list(itertools.combinations(c, 2))

我只能得到这样的结果。

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

我费了好大劲才找到这个,但我什么也没找到。

更新

哦,我糟糕的英语造成了如此混乱!我完全改变了我的例子。我想将 4 个项目分配给 2 个列表。很抱歉造成混乱!

【问题讨论】:

  • 为什么会有10选2的可能性?如果每个项目可以进入两个列表之一,那就是 2^10。另一方面,您发布的模式表明您将列表拆分为两个项目,在这种情况下,只有 9 种可能性。

标签: python iteration combinations


【解决方案1】:

我不确定您对 10 选择 2 的理解是什么。您从list(itertools.combinations(c, 2)) 收到的输出在数学上定义为 10C2


编辑

从对您问题的编辑来看,您似乎想要一种完全不同的组合。结果的数量仍然不是 45,而是:10C1 + 10C2 + 10C3 + 10C4 + 10C5


我希望以下内容可以帮助您继续前进:

for i in range(1, 6):
    for c1 in itertools.combinations(c, i):
            c1 = set(c1)
            c2 = set(c) - c1
            print c1, c2

以上代码的灵感来自this (deleted) answer by CSZ


使用range(1, 3)时收到的输出:

[1] [2, 3, 4, 5, 6, 7, 8, 9, 10]
[2] [1, 3, 4, 5, 6, 7, 8, 9, 10]
[3] [1, 2, 4, 5, 6, 7, 8, 9, 10]
[4] [1, 2, 3, 5, 6, 7, 8, 9, 10]
[5] [1, 2, 3, 4, 6, 7, 8, 9, 10]
[6] [1, 2, 3, 4, 5, 7, 8, 9, 10]
[7] [1, 2, 3, 4, 5, 6, 8, 9, 10]
[8] [1, 2, 3, 4, 5, 6, 7, 9, 10]
[9] [1, 2, 3, 4, 5, 6, 7, 8, 10]
[10] [1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2] [3, 4, 5, 6, 7, 8, 9, 10]
[1, 3] [2, 4, 5, 6, 7, 8, 9, 10]
[1, 4] [2, 3, 5, 6, 7, 8, 9, 10]
[1, 5] [2, 3, 4, 6, 7, 8, 9, 10]
[1, 6] [2, 3, 4, 5, 7, 8, 9, 10]
[1, 7] [2, 3, 4, 5, 6, 8, 9, 10]
[8, 1] [2, 3, 4, 5, 6, 7, 9, 10]
[1, 9] [2, 3, 4, 5, 6, 7, 8, 10]
[1, 10] [2, 3, 4, 5, 6, 7, 8, 9]
[2, 3] [1, 4, 5, 6, 7, 8, 9, 10]
[2, 4] [1, 3, 5, 6, 7, 8, 9, 10]
[2, 5] [1, 3, 4, 6, 7, 8, 9, 10]
[2, 6] [1, 3, 4, 5, 7, 8, 9, 10]
[2, 7] [1, 3, 4, 5, 6, 8, 9, 10]
[8, 2] [1, 3, 4, 5, 6, 7, 9, 10]
[9, 2] [1, 3, 4, 5, 6, 7, 8, 10]
[2, 10] [1, 3, 4, 5, 6, 7, 8, 9]
[3, 4] [1, 2, 5, 6, 7, 8, 9, 10]
[3, 5] [1, 2, 4, 6, 7, 8, 9, 10]
[3, 6] [1, 2, 4, 5, 7, 8, 9, 10]
[3, 7] [1, 2, 4, 5, 6, 8, 9, 10]
[8, 3] [1, 2, 4, 5, 6, 7, 9, 10]
[9, 3] [1, 2, 4, 5, 6, 7, 8, 10]
[10, 3] [1, 2, 4, 5, 6, 7, 8, 9]
[4, 5] [1, 2, 3, 6, 7, 8, 9, 10]
[4, 6] [1, 2, 3, 5, 7, 8, 9, 10]
[4, 7] [1, 2, 3, 5, 6, 8, 9, 10]
[8, 4] [1, 2, 3, 5, 6, 7, 9, 10]
[9, 4] [1, 2, 3, 5, 6, 7, 8, 10]
[10, 4] [1, 2, 3, 5, 6, 7, 8, 9]
[5, 6] [1, 2, 3, 4, 7, 8, 9, 10]
[5, 7] [1, 2, 3, 4, 6, 8, 9, 10]
[8, 5] [1, 2, 3, 4, 6, 7, 9, 10]
[9, 5] [1, 2, 3, 4, 6, 7, 8, 10]
[10, 5] [1, 2, 3, 4, 6, 7, 8, 9]
[6, 7] [1, 2, 3, 4, 5, 8, 9, 10]
[8, 6] [1, 2, 3, 4, 5, 7, 9, 10]
[9, 6] [1, 2, 3, 4, 5, 7, 8, 10]
[10, 6] [1, 2, 3, 4, 5, 7, 8, 9]
[8, 7] [1, 2, 3, 4, 5, 6, 9, 10]
[9, 7] [1, 2, 3, 4, 5, 6, 8, 10]
[10, 7] [1, 2, 3, 4, 5, 6, 8, 9]
[8, 9] [1, 2, 3, 4, 5, 6, 7, 10]
[8, 10] [1, 2, 3, 4, 5, 6, 7, 9]
[9, 10] [1, 2, 3, 4, 5, 6, 7, 8]

【讨论】:

  • 很抱歉给您带来了困惑。我完全重写了我的例子。
  • 谢谢。我想知道如何排除c1==c2True 的情况。
【解决方案2】:
l = [1,2,3,4, 5,  6, 7, 8]

print [[l[:i], l[i:]] for i in range(1, len(l))]

如果您想要所有组合。你可以这样做。

print [l[i:i+n] for i in range(len(l)) for n in range(1, len(l)-i+1)]

itertools.combinations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多