检查字典中的任何键是否匹配任何值

时间:2019-03-05 07:27:46

标签: python dictionary

我正在尝试解决此问题:

  

让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是我自己的模块中的一个函数,该函数返回所有数字因子的列表

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

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))

4 个答案:

答案 0 :(得分:1)

您的问题几乎已经解决了...赶快把所有夫妇赶走吧

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是否被视为友好对。

答案 1 :(得分:0)

此代码应为您提供所有也是值的键的列表。

my_test = [key for key in my_dict.keys() if key in my_dict.values()]

您不需要.keys(),因为这是默认行为,但是,我想在此示例中明确显示。

或者,下面可以看到一个for循环示例。

for key, value in my_dict.iteritems():
    if key == value:
        print key # or do stuff

答案 2 :(得分:0)

您可以使用集合:

x_dx = {(x, sum(alecproduct.find_factors(x)) - x) for x in range(10 ** 4)}
x_dx = {t for t in x_dx if t[0] != t[1]}
dx_x = {(t[1], t[0]) for t in x_dx}

amicable_pairs = x_dx & dx_x

就像在6502的答案中一样,所有友好对被提取两次。 删除这些“重复项”的方法可能是(尽管肯定是一口):

amicable_pairs_sorted = {tuple(sorted(t)) for t in amicable_pairs}
amicable_pairs_ascending = sorted(list(amicable_pairs_sorted))

答案 3 :(得分:0)

遍历sums字典的键和值以创建一个包含所有 amicable numbers 的新列表,以解决此问题,这是代码段。

amicable_list=[]
for i in sums.keys():
    if i in sums.values():
        if (sums.get(sums.get(i,-1),-1) == i) and (i != sums[i]):
            amicable_list.append(i)