Python 检查字典中的任何键是否与任何值匹配
我试图解决这个问题: 设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),就像这样: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:
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)