【Python 秘籍】在两个字典中寻找相同点

问题

有两个字典,我们想找出它们中间可能相同的地方(相同的键、相同的值等)。

解决方案

考虑如下两个字典:

a = {'x': 1, 'y': 2, 'z': 3}
b = {'w': 10, 'x': 11, 'y': 2}

要找出这两个字典中的相同之处,只需通过 keys()或者 items() 方法执行常见的集合操作即可。例如:

# 寻找a和b相同的键
a.keys() & b.keys()  # {'x', 'y'}

#寻找在a中但不在b中的键
a.keys() - b.keys()  # {'z'}

# 寻找a和b相同的键值对
a.items() & b.items()  # {('y', 2)}

这些类型的操作也可用来修改或过滤掉字典中的内容。例如,假设想创建一个新的字典,其中会去掉某些键。下面是使用了字典推导式的代码示例:

# 创建一个移除了某些键的新字典
c = {key: a[key] for key in a.keys() - {'z', 'w'}}  # c的结果为{'x': 1, 'y': 2}

讨论

字典就是一系列键和值之间的映射集合。字典的 keys() 方法会返回 keys-view 对象,其中暴露了所有的键。关于字典的键有一个很少有人知道的特性,那就是它们也支持常见的集合操作,比如求并集、交集和差集。因此,如果需要对字典的键做常见的集合操作,那么就能直接使用 keys-view 对象而不必先将它们转化为集合。

字典的 items()方法返回由 (key, value) 对组成的 items-view 对象。这个对象支持类似的集合操作,可用来完成找出两个字典间有哪些键值对有相同之处的操作。

尽管类似,但字典的 values() 方法并不支持集合操作。部分原因是因为在字典中键和值是不同的,从值得角度来看并不能保证所有的值都是唯一的。单这一条原因就使得某些特定得集合操作是有问题的。但是,如果必须执行这样的操作,还是可以先将值转化为集合来实现。