首頁  >  文章  >  後端開發  >  如何在 Python 中更新巢狀字典,同時保留不同深度的特定值?

如何在 Python 中更新巢狀字典,同時保留不同深度的特定值?

Linda Hamilton
Linda Hamilton原創
2024-11-12 03:58:021029瀏覽

How to Update a Nested Dictionary in Python While Preserving Specific Values at Different Depths?

具有深度保留的巢狀字典更新

在Python 中,更新巢狀字典可能很棘手,特別是當您想要將其內容與另一個字典,同時保留不同深度的特定值。考慮以下場景:

給定兩個字典,dictionary1 和update,我們如何使用update 的內容更新dictionary1,而不覆蓋最深級別的特定值(例如“levelA”),同時更新所有其他值?

dictionary1 = {
    "level1": {
        "level2": {"levelA": 0, "levelB": 1}
    }
}
update = {
    "level1": {
        "level2": {"levelB": 10}
    }
}

如果我們簡單地使用update 方法,它會覆蓋整個“level2”子詞典,丟失“levelA” value:

dictionary1.update(update)
print(dictionary1)
{
    "level1": {
        "level2": {"levelB": 10}
    }
}

為了應對這一挑戰,我們需要一個遞歸解決方案,考慮字典的可變深度並適當地合併值。

遞歸解決方案:

下面的程式碼實作了一個遞歸的「部分更新」函數,更新字典值不覆蓋指定的鍵:

import copy

def partial_update(d, u, preserve):
    for k, v in u.items():
        if isinstance(v, dict):
            if d.get(k, None) is None:
                d[k] = copy.deepcopy(v)
            else:
                partial_update(d[k], v, preserve)
        elif k in preserve:
            continue
        else:
            d[k] = copy.deepcopy(v)
    return d

partial_update 函數有三個參數:

  • d:要更新的字典
  • u:包含更新的字典
  • preserve:要保留的鍵清單覆蓋

要保留範例中的「levelA」值,我們可以使用以下程式碼:

partial_update(dictionary1, update, ["levelA"])
print(dictionary1)
{
    "level1": {
        "level2": {"levelA": 0, "levelB": 10}
    }
}

在此解決方案中,我們複製更新之前檢查字典以防止意外修改。這確保了即使在部分更新後原始詞典也保持不變。

以上是如何在 Python 中更新巢狀字典,同時保留不同深度的特定值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn