我想生成所有可能组合中的四个素数的列表,以便数字不会在该列表中重复。
我知道如何使用此功能获得我想要的东西:
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循环,并且列举了错误的方法,但似乎无法弄清楚我可能出错的地方。对我来说,两个函数看起来都应该做同样的事情。
如果可以,请指出我所犯的错误或纠正我。
答案 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])