首頁 >後端開發 >Python教學 >在Python中更新巢狀字典

在Python中更新巢狀字典

PHPz
PHPz轉載
2023-09-09 18:21:041037瀏覽

在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 類別

集合模組中的 defaultdict 類別提供了一種強大的方法來處理嵌套字典中缺少的鍵。當存取不存在的鍵時,它會自動分配一個預設值。這是一個範例

from collections import defaultdict

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

在上面的程式碼片段中,我們建立了一個defaultdict,並將dict類型作為預設工廠。這確保任何不存在的鍵都會自動建立一個新的巢狀字典。然後,我們繼續使用值“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()函數創建了嵌套字典的完整副本,包括所有層級的嵌套。這允許您更新複製的字典而不影響原始詞典。

使用字典理解更新值

For simple updates within a nested dictionary, you can use dictionary comprehensions. This approach is suitable when you have a known set of keys to update.

範例

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 类)提供了强大的工具来处理各种情况,包括丢失键和创建新键。

以上是在Python中更新巢狀字典的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:tutorialspoint.com。如有侵權,請聯絡admin@php.cn刪除