首页 > 解决方案 > 检查字典中的任何键是否匹配任何值

问题描述

我正在尝试解决这个问题:

令 d(n) 定义为 n 的真因数之和(小于 n 的数均分为 n)。如果 d(a) = b 且 d(b) = a,其中 a ≠ b,则 a 和 b 是友好对,a 和 b 中的每一个都称为友好数。

例如,220的真因数是1、2、4、5、10、11、20、22、44、55和110;因此 d(220) = 284。284 的真因数是 1、2、4、71 和 142;所以 d(284) = 220。

评估所有小于 10000 的友好数字的总和。

我想出了一个字典,其中包含所有数字 0 到 9999 的 x:d(x),如下所示:

sums = {x:sum(alecproduct.find_factors(x))-x for x,y in enumerate(range(10**4))}

其中 alecproduct.findfactors 是我自己的模块中的一个函数,它返回一个数字的所有因子的列表

不过,我不确定从这里去哪里。我尝试遍历字典并从每个 kv 对中创建元组,如下所示:

for k,v in sums.items():
    dict_tups.append((k,v))

但我认为这对我没有帮助。关于如何检测任何字典键是否匹配任何字典值的任何建议?

编辑 - 我的解决方案基于 6502 的回答:

sums,ap = {x:sum(find_factors(x))-x for x,y in enumerate(range(10**4))}, []

for x in sums:
    y = sums[x]
    if sums.get(y) == x and x != y:
        ap.append(x)

print(ap)
print('\nSum: ', sum(ap))

标签: pythondictionary

解决方案


你的问题几乎已经解决了......只要把所有的夫妇都拿出来:

for x in my_dict:
    y = my_dict[x]
    if my_dict.get(y) == x:
        # x/y is an amicable pair
        ...

请注意,每对将被提取两次(x/yy/ x),并且仅提取一次完美数(作为除数之和的数字);从您的问题文本中不确定 6/6 是否被认为是友好的一对。


推荐阅读