1.9 查找两字典的相�点¶

问题¶

怎样在两个字典中寻寻找相�点(比如相�的键�相�的值等等)?

解决方案¶

考虑下�两个字典:

a = {
    'x' : 1,
    'y' : 2,
    'z' : 3
}

b = {
    'w' : 10,
    'x' : 11,
    'y' : 2
}

为了寻找两个字典的相�点,�以简�的在两字典的 keys() 或者 items() 方法返回结果上执行集��作。比如:

# Find keys in common
a.keys() & b.keys() # { 'x', 'y' }
# Find keys in a that are not in b
a.keys() - b.keys() # { 'z' }
# Find (key,value) pairs in common
a.items() & b.items() # { ('y', 2) }

这些�作也�以用于修改或者过滤字典元素。 比如,�如你想以现有字典构造一个排除几个指定键的新字典。 下�利用字典推导�实现这样的需求:

# Make a new dictionary with certain keys removed
c = {key:a[key] for key in a.keys() - {'z', 'w'}}
# c is {'x': 1, 'y': 2}

讨论¶

一个字典就是一个键集�与值集�的映射关系。 字典的 keys() 方法返回一个展现键集�的键视图对象。 键视图的一个很少被了解的特性就是它们也支�集��作,比如集�并�交�差�算。 所以,如果你想对集�的键执行一些普通的集��作,�以直接使用键视图对象而�用先将它们转��一个 set。

字典的 items() 方法返回一个包� (键,值) 对的元素视图对象。 这个对象�样也支�集��作,并且�以被用�查找两个字典有哪些相�的键值对。

尽管字典的 values() 方法也是类似,但是它并�支�这里介�的集��作。 ��程度上是因为值视图�能��所有的值互�相�,这样会导致�些集��作会出现问题。 �过,如果你硬�在值上�执行这些集��作的�,你�以先将值集�转�� set,然��执行集��算就行了。