天天看點

查找兩字典的相同點查找兩字典的相同點(摘自 python3cookbook)

查找兩字典的相同點

(摘自 python3cookbook)

問題

怎樣在兩個字典中尋尋找相同點(比如相同的鍵、相同的值等等)?

解決方案

考慮下面兩個字典:

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,然後再執行集合運算就行了。