更新 Python 中的巢狀字典


在 Python 中,字典是一種通用的資料結構,允許您高效地儲存和檢索鍵值對。特別是巢狀字典,提供了一種方便的方式來組織和表示複雜資料。但是,更新巢狀字典中的值有時可能有點挑戰。

訪問巢狀字典元素

要更新巢狀字典中的值,我們首先需要訪問字典層次結構中的特定鍵。Python 允許您透過連續使用鍵來訪問巢狀元素。例如:

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
nested_dict['outer_key']['inner_key'] = 'new_value'

在上面的程式碼片段中,我們透過連續連結鍵來訪問巢狀元素“inner_key”,並將它的值更新為“new_value”。

更新單層巢狀字典

有時,您可能會遇到一個巢狀字典,其中不同級別的鍵沒有固定的結構。在這種情況下,需要一種更通用的方法。Python 提供了 update() 方法,允許我們將一個字典合併到另一個字典中,從而更新其值。這是一個示例:

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
update_dict = {'inner_key': 'new_value'}
nested_dict['outer_key'].update(update_dict)

在上面的程式碼片段中,我們建立了一個單獨的字典 update_dict,其中包含我們要更新的鍵值對。透過使用 update() 方法,我們將 update_dict 合併到指定鍵級別的巢狀字典中,有效地更新其值。

更新多層巢狀字典

如果您需要更新多層巢狀字典中的值,您可以採用遞迴方法。這種方法涉及遞迴遍歷字典,直到找到所需的鍵。這是一個示例:

def update_nested_dict(nested_dict, keys, new_value):
   if len(keys) == 1:
      nested_dict[keys[0]] = new_value
   else:
      key = keys[0]
      if key in nested_dict:
         update_nested_dict(nested_dict[key], keys[1:], new_value)

nested_dict = {'outer_key': {'inner_key': {'deep_key': 'old_value'}}}
keys = ['outer_key', 'inner_key', 'deep_key']
new_value = 'new_value'
update_nested_dict(nested_dict, keys, new_value)

在上面的程式碼片段中,我們定義了一個遞迴函式 update_nested_dict,它將巢狀字典、鍵列表和新值作為引數。該函式檢查列表中是否只有一個鍵;如果是,則更新巢狀字典中的值。否則,它將遍歷更深層的巢狀字典,直到找到所需的鍵。

處理丟失的鍵和建立新的鍵

更新巢狀字典時,務必考慮指定鍵可能不存在的情況。Python 提供了幾種技術來處理這種情況,並在需要時建立新的鍵。

使用 setdefault() 方法

setdefault() 方法是一種方便的方法,可以在處理丟失的鍵的同時更新巢狀字典中的值。它允許您在鍵不存在時指定一個預設值。如果找到鍵,則返回現有值。否則,預設值將插入到字典中。這是一個示例:

nested_dict = {'outer_key': {}}
nested_dict['outer_key'].setdefault('inner_key', 'new_value')

在上面的程式碼片段中,我們使用 setdefault() 方法更新巢狀字典的“outer_key”中“inner_key”的值。如果“inner_key”不存在,則它將使用值“new_value”建立。

使用 Defaultdict 類

collections 模組中的 defaultdict 類提供了一種強大的方法來處理巢狀字典中丟失的鍵。當訪問不存在的鍵時,它會自動分配一個預設值。這是一個示例:

from collections import defaultdict

nested_dict = defaultdict(dict)
nested_dict['outer_key']['inner_key'] = 'new_value'

在上面的程式碼片段中,我們使用 dict 型別作為預設工廠建立一個 defaultdict。這確保了任何不存在的鍵都將自動建立一個新的巢狀字典。然後,我們繼續使用值“new_value”更新“outer_key”中的“inner_key”。

更新深度巢狀字典中的值

如果您的巢狀字典有多個巢狀級別,並且您需要更新最內層的值,則遞迴方法變得更加有用。您可以透過相應地修改遍歷邏輯來擴充套件遞迴函式以處理深度巢狀字典。

def update_deep_nested_dict(nested_dict, keys, new_value):
   if len(keys) == 1:
      nested_dict[keys[0]] = new_value
   else:
      key = keys[0]
      if key in nested_dict:
         update_deep_nested_dict(nested_dict[key], keys[1:], new_value)
      else:
         nested_dict[key] = {}
         update_deep_nested_dict(nested_dict[key], keys[1:], new_value)

nested_dict = {'outer_key': {'inner_key': {'deep_key': 'old_value'}}}
keys = ['outer_key', 'inner_key', 'deep_key']
new_value = 'new_value'
update_deep_nested_dict(nested_dict, keys, new_value)

在上面的程式碼片段中,我們增強了之前的遞迴函式以處理深度巢狀字典。如果任何級別缺少鍵,則會建立一個新的空字典,並且該函式將繼續遍歷直到到達最內層的鍵。

不可變巢狀字典

需要注意的是,Python 中的字典是可變物件。因此,當您更新巢狀字典時,更改將反映在對該字典的所有引用中。如果您需要保持巢狀字典的原始狀態,可以在進行任何更新之前建立它的深複製。

import copy

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
updated_dict = copy.deepcopy(nested_dict)
updated_dict['outer_key']['inner_key'] = 'new_value'

示例

import copy

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
updated_dict = copy.deepcopy(nested_dict)
updated_dict['outer_key']['inner_key'] = 'new_value'

print("Original nested_dict:")
print(nested_dict)

print("\nUpdated_dict:")
print(updated_dict)

輸出

以下是上面部分中提到的程式碼片段的輸出:

Original nested_dict:
{'outer_key': {'inner_key': 'old_value'}}

Updated_dict:
{'outer_key': {'inner_key': 'new_value'}}

在上面的程式碼片段中,copy.deepcopy() 函式建立了巢狀字典的完整副本,包括所有巢狀級別。這允許您更新複製的字典而不會影響原始字典。

使用字典推導式更新值

對於巢狀字典中的簡單更新,您可以使用字典推導式。當您有一組已知的鍵要更新時,此方法適用。

示例

nested_dict = {'outer_key': {'inner_key': 'old_value'}}
keys_to_update = ['outer_key']
updated_dict = {key: 'new_value' if key in keys_to_update else value for key, value in nested_dict.items()}

輸出

以下是上述程式碼片段的輸出:

Original nested_dict:
{'outer_key': {'inner_key': 'old_value'}}

Updated_dict:
{'outer_key': {'inner_key': 'new_value'}}

在程式碼片段中,我們從包含巢狀結構的 nested_dict 字典開始。我們使用 copy.deepcopy() 建立 nested_dict 的深複製並將其分配給 updated_dict。然後,我們將 updated_dict 中“outer_key”內的“inner_key”的值更新為“new_value”。

最後,我們列印原始 nested_dict 和更新後的 updated_dict。正如您從輸出中看到的,原始 nested_dict 保持不變,而 updated_dict 反映了更新後的值。

結論

更新 Python 中的巢狀字典可能涉及訪問特定鍵、合併字典或使用遞迴技術。通過了解這些不同的方法,您可以根據您的具體需求有效地更新巢狀字典中的值。在選擇最合適的方法時,請記住考慮巢狀字典的結構和複雜性。

Python 的靈活性和內建方法(例如 update()、setdefault() 和 defaultdict 類)提供了強大的工具來處理各種場景,包括丟失的鍵和建立新的鍵。

更新於:2023年8月16日

5K+ 次瀏覽

啟動您的 職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.