一、與字典值有關的計算
問題
想對字典的值進行相關計算,例如找出字典里對應值最大(最小)的項。
解決方案一:
假設要從字典 {'a':3, 'b':2, 'c':6} 中找出值最小的項,可以這樣做:
>>> d = {'a':3, 'b':2, 'c':6}>>> min(zip(d.values(), d.keys()))(2, 'b')
值得注意的是 d.values() 獲取字典的全部值,d.keys()
獲取字典的全部鍵,而且兩個序列的順序依然保持一一對應的關系。因此 zip(d.values() , d.keys())
實質上生成的是一個 (value, key) 的序列。min 函數通過比較序列中的元組 (value, key) 找出其最小值。
解決方案二:
除了使用 zip(d.values() , d.keys())
外,還可以使用 dict.items()
方法和生成器推導式來生成 (value, key) 序列,從而傳遞給 min 函數進行比較:
>>> d = {'a':3, 'b':2, 'c':6}>>> min((v ,k) for (k, v) in d.items())(2, 'b')
這里 min 函數的參數 (v ,k) for (k, v) in d.items()
其實是一個生成器推導式(和列表推導式一樣,只是把列表推導式的 [] 改為 () ,而且其返回的一個生成器而非列表),由于生成器推導式做為 min 函數的參數,所以可以省略掉兩邊的括號(不做為參數時寫法應該是 ((v ,k) for (k, v) in d.items()) )
。
二、字典推導式
問題
想把一個元組列表轉換成一個字典,例如把 [('a', 1), ('b', 2), ('c', 3)]
轉化為 {'a': 1, 'b': 2, 'c': 3}
解決方案
類似于列表推導式,字典推導式可以方便地從其他數據結構構造字典,例如:
>>> l = [('a', 1), ('b', 2), ('c', 3)]>>> {k: v for k, v in l}{'c': 3, 'b': 2, 'a': 1}
字典推導式的規則和列表推導式一樣,只是把 [] 換成 {}
三、尋找字典的交集
問題
假設有兩個字典:
d1 = {'a':1, 'b':2, 'c':3, 'd':4}d2 = {'b':2, 'c':3, 'd':3, 'e':5}
要找出這兩個字典中具有公共鍵的項,即要得到結果 {'b':2, 'c':3}
解決方案
我們知道一般通過 d.items()
方法來遍歷字典,d.items()
方法返回的對象是一個類集合對象,支持集合的基本運算,如取交集、并集等。
>>> dict(d1.items() & d2.items()) # 取交集{'b': 2, 'c': 3}
此外,d.keys()
返回字典的鍵,也是一個類集合對象,如果我們只想找出兩個字典中鍵相同的項,可以這樣:
>>> { k:d1[k] for k in d1.keys() & d2.keys() }{'b': 2, 'd': 4, 'c': 3}
這里如果相同的鍵對應不同的值則去第一個字典中的值。推廣開來,如果想排除掉字典中的某些鍵,可以這樣:
新聞熱點
疑難解答