在Python词典中查找值

时间:2013-05-19 23:42:49

标签: python math

我正在尝试记住除数的数字。

divisorSums = {}

def sumDivisors(num):

    global divisorSums

    total = 0

    if num == 1:
        return 0

    for i in xrange(num/2, 0, -1):
        if i in divisorSums:
            return divisorSums[i]
        else:
            if not num % i:
                total += i

    divisorSums[num] = total

    return total

然而,当我遍历数字时,这会为所有数字返回1。当它单独使用时是正确的,所以问题是我的查找系统。我很确定我不明白如何在字典中查找值。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:3)

memoize的常用快捷方法是使用可变的默认参数

def sumDivisors(num, divisorSums={}):

    if num in divisorSums:          # Check if you have
        return divisorSums[num]     # memoized the answer here

    total = 0

    if num == 1:
        return 0

    for i in xrange(num/2, 0, -1):
        if not num % i:
            total += i

    divisorSums[num] = total

    return total

除此之外,您的代码似乎正常工作。你是如何运行它来获得1的?

答案 1 :(得分:2)

下面:

if i in divisorSums:
            return divisorSums[i]

返回divisorSums [i]不是正确的做法,因为可能有一些素数因子小于i。以下是使用辅助函数记忆/计算数字因子的一种方法:

from itertools import groupby
divisorC={}
def divisors(num):
    if num in divisorC:
        return divisorC[num]
    l = {1:1}
    for i in xrange(num/2, 1, -1):
        if num % i == 0:
            l[i] = 1 
            l.update(divisors(i))
            l.update(divisors(num/i))
            break
    divisorC[num] = l 
    return divisorC[num]
def sumDivisors(num):
    if num == 1: return 0
    l = {}
    for i in xrange(num/2, 0, -1):
        if num % i == 0:
            l.update(divisors(i))
            l.update(divisors(num/i))
            l[i] = 1 
            l[num/i] = 1 
            break
    return sum(v for v in l)