比较两个字典并检查多少对(键,值)相等

365 投票
29 回答
895555 浏览
提问于 2025-04-16 09:00

我有两个字典,但为了简单起见,我只拿这两个来讲:

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

撰写回答