我在解欧拉计划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/

10-10 18:27