获得4个for循环的所有主要组合 - Python

时间:2015-12-18 22:32:16

标签: python

我想生成所有可能组合中的四个素数的列表,以便数字不会在该列表中重复。

我知道如何使用此功能获得我想要的东西:

def combinations():
    primeList = [2, 3, 5, 7, 11, 13, 17]
    length = len(primeList)
    for i in range(0, length-3): 
        for j in range(i+1, length-2):
            for k in range(j+1, length-1):
                for h in range(k+1, length):
                    print([primeList[i], primeList[j], primeList[k], primeList[h]])

返回此类列表:http://postimg.org/image/94u3hzgqb/

但是我想使用像下面那样构造的代码,因为我想要这个特殊的结构,并想知道它的行为与我刚刚复制粘贴的函数的行为方式不同。

def combinations2():
    primeList = [2, 3, 5, 7, 11, 13, 17]
    for i1, i in enumerate(primeList[0: -3]): 
        for i2, j in enumerate(primeList[i1+1: -2]):
            for i3, k in enumerate(primeList[i2+1: -1]):
                for h in primeList[i3+1:]:
                    print([i, j, k, h])

返回包含重复元素的列表:http://postimg.org/image/y0h0gwfhf/

显然我正在使用for循环,并且列举了错误的方法,但似乎无法弄清楚我可能出错的地方。对我来说,两个函数看起来都应该做同样的事情。

如果可以,请指出我所犯的错误或纠正我。

1 个答案:

答案 0 :(得分:1)

这是因为i1,i2,i3都是从零开始的。在第一次迭代中,您有

primeList[i1+1: -2] = [3, 5, 7, 11]
primeList[i2+1: -1] = [3, 5, 7, 11, 13]
primeList[i3+1:]    = [3, 5, 7, 11, 13, 17]

这是正确的功能:

def combinations2():
    primeList = [2, 3, 5, 7, 11, 13, 17]
    for i1, i in enumerate(primeList[0: -3]):
        for i2, j in enumerate(primeList[i1+1: -2]):
            for i3, k in enumerate(primeList[i1+i2+2: -1]):
                for h in primeList[i1+i2+i3+3:]:
                    print([i, j, k, h])