python:迭代非序列错误

时间:2012-11-27 11:33:36

标签: python iteration

刚刚启动项目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'

2 个答案:

答案 0 :(得分: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]))

一个序列。

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

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

答案 1 :(得分:0)

你真的不需要和电话。取代

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