刚刚启动项目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'
答案 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]))