比较两个字典的值以获得它们的数值差异(Python)

4
我是新手,正在学习Python。我有两个字典,这两个字典具有相同的键但不同的键值。我想比较这两个字典,以便获得每个键的值之间的数字差异。例如:
dict1 = {'hi' : 45, 'thanks' : 34, 'please' : 60} dict2 = {'hi' : 40, 'thanks' : 46, 'please' : 50}
换句话说,我想要一个第三个字典或一对列表,其中显示这两个字典中值之间的数值差异(即从字典2减去字典1)。它将类似于以下内容:
dict_difference = {'hi' : 5 , 'thanks' : -12, 'please' : 10}
我知道通过以下方式相减一个字典从另一个字典:
dict1 = Counter({'hi' = 45, 'thanks' = 34, 'please' = 60}) dict2 = Counter({'hi' = 40, 'thanks' = 46, 'please' = 50}) dict3 = dict1-dict2 #只返回正值,因此会得到: dict3 = {'hi'= 5, 'please' = 10} # 这不是我想要的。
我还考虑将字典转换为一组成对的列表:
dictlist = []
for key, value in dict1.iteritems():`

     temp = (key, value)
     dictlist.append(temp)

因此

print dictlist     #gives: 

[('hi', 45),('thanks' = 34), ('please' = 60)]

所以我认为如果我能够将字典转换为键值对列表,然后以key:value的形式呈现,即key = value,我就能够应用subtract()方法并实现我的目标。
我考虑通过def __repr__(self)来实现,如https://docs.python.org/2/library/collections.html所示,但是我没有进展。
如果可能,请留下代码说明。如果我的方法不正确,并且有更简单的从一个字典中减去另一个字典的方法,请分享。非常感谢您的帮助。

这些不是以字典格式呈现的。 - letsc
2个回答

10

首先,您的字典格式不正确(使用 : 而非 =):

dict1 = {'hi':45, 'thanks':34, 'please':60}
dict2 = {'hi':40, 'thanks':46, 'please':50}
你可以使用字典推导式。基本上,你会循环遍历一个字典,检查键是否也出现在第二个字典中,并将值的差异插入到输出字典中。所有操作都在一行完成。
dic = {key: dict1[key]-dict2[key] for key in dict1 if key in dict2}

嗨!非常感谢您的回复,以及为我解决问题并纠正我的字典语法。我尝试了一下,确实有效!谢谢! - HR123r

3
你考虑使用字典的键是正确的。
在这里,我遍历第一个字典的键,检查它们是否存在于字典2中。然后我用同样的方法遍历字典2,在字典1中检查键,但同时确保键不在结果字典中,以避免重复减法。
dict1 = {'hi': 45, 'thanks': 34, 'please': 60}
dict2 = {'hi': 40, 'thanks': 46, 'please': 50}
result = {}

for key in dict1.keys():
    if key in dict2:
    result[key] = dict1[key] - dict2[key]

for key in dict2.keys():
    if key in dict1 and not key in result:
    result[key] = dict1[key] - dict2[key]

如果目标仅是处理两个字典共享的键,则第二个循环是不必要的,因为第一个循环已经找到了所有共享的键。此外,调用keys是不必要的,因为在字典上循环遍历已经遍历了键。调用keys只会浪费时间和空间来构建键列表。 - user2357112
刚想说同样的话。 - Julien Spronck
@JulienSpronck的代码实际上比这个更有效率,所以请使用他的。 - Celeo
非常感谢您的回复!! - HR123r

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接