HOWTO · Python
Python 中具有多個值的字典
本教程演示如何在 python 中為字典中的鍵新增多個值
本頁內容
Python 字典會為每個鍵儲存一個值。這個值可以是清單,因此你可以讓一個鍵對應多個項目,並隨著資料到來繼續加入項目。
例如,下方 "a" 對應的值是清單 [1, 2]:
d = {"a": [1, 2], "b": [2, 3], "c": [4, 5]}
print(d)
當你需要將重複的鍵分組,或把數個相關值放在一起時,這種模式就很實用。以下範例會介紹可重複使用的輔助函式、defaultdict 和 setdefault()。
使用自訂函式將多個值加入字典中的同一個鍵
輔助函式可以在鍵首次出現時初始化它,接著使用 extend() 將可迭代物件中的每個項目加入現有清單。這裡的函式會修改並回傳傳入的字典;它不會將傳入的清單當成巢狀項目儲存。
請執行以下範例:
def add_values(mapping, key, values):
if key not in mapping:
mapping[key] = []
mapping[key].extend(values)
return mapping
word_freq = {"tutorial": [2, 3, 5]}
add_values(word_freq, "tutorial", [20, 21, 22])
print(word_freq)
如果你想為這項操作命名,或需要在多個地方套用相同的初始化邏輯,這種做法就很合適。將清單等可迭代物件傳給 extend();其中的每個項目都會加入目標清單。
使用 defaultdict 將多個值加入字典中的同一個鍵
從 collections 匯入 defaultdict,並將 list 設為它的預設工廠函式。查詢不存在的鍵時,會建立並儲存一個新清單,因此很適合用來將含有重複鍵的配對分組。一般字典查詢不存在的鍵時會引發 KeyError;defaultdict 並非在所有操作中都能避免這個錯誤,因為它的工廠函式會用於 d[key] 這類查詢,不會用於 get() 等方法。
以下範例會將每個值分組到對應的鍵下:
from collections import defaultdict
pairs = [("rome", 1), ("paris", 2), ("newyork", 3), ("paris", 4), ("delhi", 1)]
grouped = defaultdict(list)
for key, value in pairs:
grouped[key].append(value)
print(dict(grouped))
當你要從由鍵值配對組成的可迭代物件建立對應表時,可以使用這種寫法。列印前轉換成 dict,即可顯示分組後的資料,而不會帶有 defaultdict 型別的外層表示。
使用 setdefault() 方法將多個值加入字典中的特定鍵
setdefault() 會回傳鍵目前儲存的值。如果鍵不存在,它會加入指定的預設值並回傳該值。若省略預設值引數,預設值就是 None;此範例提供空清單,讓回傳的值可以使用 append()。
pairs = [("rome", 1), ("paris", 2), ("newyork", 3), ("paris", 4), ("delhi", 1)]
data = {}
for key, value in pairs:
data.setdefault(key, []).append(value)
print(data)
如果每個輸入配對都會提供一個項目,可以在簡潔的迴圈中使用 setdefault()。若初始化邏輯較複雜或會重複使用,輔助函式或 defaultdict 可能更容易維護。