我正在尝试解决此问题:
让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))
答案 0 :(得分:1)
您的问题几乎已经解决了...赶快把所有夫妇赶走吧
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是否被视为友好对。
答案 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)