-1

刚刚开始项目 euler 的问题 164,我想要一个函数来输出 20 位数字中每组 3 个连续数字的总和的列表。这是我的功能。

    def func(n):
    sumlist = []
    m = str(n)
    for i in range(0,18):
         sumlist.append(sum(int(m[i])+int(m[i+1])+int(m[i+2])))
    return sumlist

我不断在非序列错误上进行迭代,我不知道为什么我应该这样做。任何帮助将不胜感激,谢谢。

编辑

完整的追溯是:

Traceback (most recent call last): 
  File "peproblem164.py", line 8, in ? print func(11201201201201201201) 
  File "peproblem164.py", line 5, in func    
    sumlist.append(sum(int(m[i])+int(m[i+1])+int(m[i+2]))) 
TypeError: iteration over non-sequence'
4

2 回答 2

3

那是因为

int(m[i]) + int(m[i+1]) + int(m[i+2])

不是一个序列。这是一个int. 我相信你的意思是:

sumlist.append(sum((int(m[i]), int(m[i+1]), int(m[i+2]))

这会起作用,因为

(int(m[i]), int(m[i+1]), int(m[i+2]))

一个序列。

总而言之,使用整数列表而不是字符串会更容易,因此首先转换mints 是有意义的:

m = map(int, str(n))

然后使用 Python 的切片语法来获取子序列和:

for i in range(18): #Leaving out the start argument is equivalent to range(0, 18)
    sumlist.append(sum(m[i:i+3]))

并且使用列表理解会更加pythonic (更不用说更快了):

sumlist = [m[i:i+3] for i in range(18)] #same thing as the for loop
于 2012-11-27T11:36:47.927 回答
0

你真的不需要 sum 调用。代替

sumlist.append(sum(int(m[i])+int(m[i+1])+int(m[i+2])))

sumlist.append(int(m[i])+int(m[i+1])+int(m[i+2]))
于 2012-11-27T11:39:26.620 回答