HOWTO · Python

在 Python 中的迴圈內將鍵值對新增到字典中

瞭解如何在 Python 的迴圈中將鍵值對新增到字典中。

本頁內容

字典指派可以新增或更新項目:在迴圈中使用 dictionary[key] = value。如果鍵和值分別位於不同的可迭代物件中,可在 for 迴圈裡用 zip() 將它們配成一組。需要索引本身時,則使用 while 迴圈。

在迴圈中將鍵值對加入字典

先建立字典,接著在迴圈逐一處理每組資料時,將每個鍵指派給對應的值。值可以是不同類型的 Python 物件;鍵則必須可雜湊。以下範例會將姓名與分數配對:

使用 zip() 配對鍵和值

每次迭代時,zip(keys, values) 都會從各個可迭代物件中產生一組項目。執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

keys = ["Ada", "Linus", "Grace"]
values = [98, 91, 100]

scores = {}
for key, value in zip(keys, values):
    scores[key] = value

print(scores)
{'Ada': 98, 'Linus': 91, 'Grace': 100}

指派會將每個分數存到相配的姓名底下。值也可以是清單、函式或其他物件;只有字典的鍵需要符合可雜湊條件。

需要索引時使用 while 迴圈

當其他操作需要位置資訊時,使用索引的迴圈會很方便。設定停止條件,並在每次迴圈執行後遞增索引:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

keys = ["Ada", "Linus", "Grace"]
values = [98, 91, 100]
scores = {}
index = 0
limit = min(len(keys), len(values))

while index < limit:
    scores[keys[index]] = values[index]
    index += 1

此處的 limit 可確保迴圈只存取兩個清單都具有的索引位置。若只是要配對資料,使用 for key, value in zip(keys, values) 更精簡,也不必自行管理索引。

處理長度不同的輸入與既有鍵

預設情況下,zip() 會在最短的可迭代物件耗盡時停止。較長輸入中未配對的項目會被略過。如果每個鍵都必須有值,請在迴圈前比較輸入長度,並決定程式遇到長度不一致時應如何處理。

若指派的鍵已存在於字典中,該鍵原有的值會被取代;字典不會建立兩個相同的鍵。若要保留多個值,可將集合型別的物件存為值,再將新值附加其中。鍵必須可雜湊,因此字串、數字,以及由可雜湊項目組成的元組都可用作鍵;可變動的清單和字典則不行。

列印結果並了解複雜度

可以使用 print(scores) 檢視小型字典,也可以迭代 scores.items(),格式化輸出每個鍵和值。範例中的簡單字典表示法會得到固定結果。自訂物件的表示法可能包含記憶體位址;若需要易讀且可重複的輸出,請列印特定屬性。

對於 m 組資料,迴圈會執行 m 次指派;由於每次字典指派平均需要 O(1) 時間,整體平均時間為 O(m)。這是平均情況;發生雜湊碰撞時,個別指派可能會較慢。輸出字典最多包含 m 個不同的鍵,因此額外空間為 O(m)。zip() 迭代器本身只使用常數輔助空間。如果字典原本有 d 個項目,除非某個配對鍵取代既有值,否則這些項目都會保留;最後的字典大小最多為 d + m。