Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 检查字典中的任何键是否与任何值匹配_Python_Dictionary - Fatal编程技术网

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

Python 检查字典中的任何键是否与任何值匹配,python,dictionary,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:

我试图解决这个问题:

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

此代码应该为您提供一个同时也是值的所有键的列表

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

你的问题几乎已经解决了。。。让所有的夫妇都出去:

for x in my_dict:
    y = my_dict[x]
    if my_dict.get(y) == x:
        # x/y is an amicable pair
        ...
请注意,每一对将被提取两次(包括
x
/
y
y
/
x
),而完美数(是其除数之和的数字)仅提取一次;从您的问题文本中不确定6/6是否被视为友好的一对。

您可以使用集合:

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的回答中,所有友好对都提取了两次。 消除这些“重复项”的一种方法可能是(尽管这肯定是一种口惠):


通过迭代
sums
字典中的键和值来创建包含所有友好数字的新列表解决了这个问题,下面是代码片段

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) 

我认为你可以简化
sums={x:sum(alecproduct.find_factors(x))-x对x的取值范围(10**4)}
@Elias Strehle这是怎么回事?我想不出一个更快的方法来理解口述。我的评论包含了建议的简化。我想您不需要
枚举
。但是我对Python 2不是很确定……我甚至没有意识到你已经更改了代码,哈哈。我添加了enumerate,因为我得到了
无法解包int
错误。我看到您删除了y和枚举,它怎么知道在没有y的情况下将sum()放在value位置?我不太清楚您的意思。
在dict理解中分离键和值。这非常有效。只需要添加x!=对那个if语句进行修改
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)