比较两个字典并检查多少对(键,值)相等
我有两个字典,但为了简单起见,我只拿这两个来讲:
>>> x = dict(a=1, b=2)
>>> y = dict(a=2, b=2)
现在,我想比较一下字典 x
中的每一个 key, value
对,看看它在字典 y
中是否有相同的对应值。所以我写了这个:
>>> for x_values, y_values in zip(x.iteritems(), y.iteritems()):
if x_values == y_values:
print 'Ok', x_values, y_values
else:
print 'Not', x_values, y_values
这样做是有效的,因为它返回了一个 tuple
(元组),然后再进行比较。
我有几个问题:
这样做对吗?有没有更好的方法?这里的“更好”不是指速度,而是代码的优雅程度。
更新:我忘了提到,我还需要检查有多少个 key, value
对是相等的。
29 个回答
217
你想做的事情其实就是 x == y
你现在做的方式不太好,因为字典里的东西本来就没有顺序。你可能在比较 [('a', 1),('b', 1)]
和 [('b', 1), ('a', 1)]
(这两个字典是一样的,但顺序不同)。
比如,看看这个:
>>> x = dict(a=2, b=2, c=3, d=4)
>>> x
{'a': 2, 'c': 3, 'b': 2, 'd': 4}
>>> y = dict(b=2, c=3, d=4)
>>> y
{'c': 3, 'b': 2, 'd': 4}
>>> zip(x.iteritems(), y.iteritems())
[(('a', 2), ('c', 3)), (('c', 3), ('b', 2)), (('b', 2), ('d', 4))]
它们之间的区别只有一个项目,但你的算法会认为 所有 项目都是不同的。
229
当然可以!请看下面的内容:
在编程中,有时候我们需要让程序做一些事情,比如重复执行某个操作。为了实现这个目的,我们可以使用“循环”这个概念。简单来说,循环就像是一个指令,让程序不停地做某件事,直到满足某个条件为止。
比如说,如果你想让程序数数,从1数到10,你可以用循环来实现。程序会从1开始,依次加1,直到它到达10为止。这样就不需要手动写出每一个数字了。
另外,循环有很多种类型,比如“for循环”和“while循环”。“for循环”通常用于知道要执行多少次的情况,而“while循环”则适合在不知道具体次数的情况下使用,只要条件满足就会继续执行。
总之,循环是编程中非常重要的一个概念,它可以帮助我们简化代码,让程序更加高效。
def dict_compare(d1, d2):
d1_keys = set(d1.keys())
d2_keys = set(d2.keys())
shared_keys = d1_keys.intersection(d2_keys)
added = d1_keys - d2_keys
removed = d2_keys - d1_keys
modified = {o : (d1[o], d2[o]) for o in shared_keys if d1[o] != d2[o]}
same = set(o for o in shared_keys if d1[o] == d2[o])
return added, removed, modified, same
x = dict(a=1, b=2)
y = dict(a=2, b=2)
added, removed, modified, same = dict_compare(x, y)
262
如果你想知道两个字典中有多少个值是相同的,你应该这么说 :)
也许可以这样做:
shared_items = {k: x[k] for k in x if k in y and x[k] == y[k]}
print(len(shared_items))