我在解欧拉计划problem 34
我的代码如下:
import functools
limit = int(input())
factDict = { 0:1, 1:1, 2:2, 3:6, 4:24, 5:120, 6:720, 7:5040, 8:40320, 9:362880 }
for i in range(10, limit):
listNum = list(map(int, list(str(i))))
#print(listNum)
sumFact = functools.reduce(lambda x, y: factDict[x] + factDict[y], listNum)
if(sumFact%i == 0):
print(i)
它可以工作到140,然后给出:
Traceback (most recent call last):
File "solution.py", line 10, in <module>
sumFact=functools.reduce(lambda x, y: factDict[x]+factDict[y], listNum)
File "solution.py", line 10, in <lambda>
sumFact=functools.reduce(lambda x, y: factDict[x]+factDict[y], listNum)
KeyError: 25
我也打印了名单,发现没有问题。
我哪里做错了?
最佳答案
您没有正确使用functools.reduce()
。
这:functools.reduce(lambda x, y: factDict[x] + factDict[y], listNum)
应用于[1,4,0]将(尝试)计算:
factDict[factDict[1] + factDict[4]] + factDict[0]
导致此索引错误(factDict[1]+factDict[4]等于25)。
根据to the doc:
左参数x是累积值
因此,如果使用factDict[x],您将用它的阶乘(而不是您想要的)替换累积值。
所以你得让x“一个人”呆着。
然后,要初始化为“中性”,您只需使用0,这样,它将实际计算(140):
0 + factDict[1] + factDict[4] + factDict[0]
最后:
#!/usr/bin/env python3
import functools
limit = int(input())
factDict = { 0:1, 1:1, 2:2, 3:6, 4:24, 5:120, 6:720, 7:5040, 8:40320, 9:362880 }
for i in range(10, limit):
listNum = list(map(int, list(str(i))))
#print(listNum)
sumFact = functools.reduce(lambda x, y: x + factDict[y], listNum, 0)
if(sumFact == i):
print("Found: " + str(i))
此外,我修改了
sumFact == i
中的最后一个测试,因为您寻找的数字等于它们的阶乘之和,而不是它们的阶乘之和的除数。(如注释中所述,您可以使用您喜欢的测试)。PS这并没有给出很多结果:
$ ./test_script.py
1000000
Found: 145
Found: 40585
关于python - 我的代码给出的Key错误超出限制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36063800/