ホームページ >バックエンド開発 >Python チュートリアル >さまざまな深さで特定の値を保持しながら、Python でネストされた辞書を更新するにはどうすればよいですか?

さまざまな深さで特定の値を保持しながら、Python でネストされた辞書を更新するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-11-12 03:58:021065ブラウズ

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

深さを保持したネストされた辞書の更新

Python では、特にその内容をマージする場合、ネストされた辞書の更新は難しい場合があります。異なる深さで特定の値を保持しながら、別の辞書を作成します。次のシナリオを考えてみましょう:

dictionary1 と update という 2 つの辞書がある場合、他のすべての値を更新しながら、最深レベルの特定の値 (例: "levelA") を上書きせずに、description1 を update の内容で更新するにはどうすればよいでしょうか。 ?

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

単純に update メソッドを使用すると、「level2」サブディクショナリ全体が上書きされ、「levelA」値が失われます。

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 関数は 3 つの引数を取ります:

  • d: 更新する辞書
  • u:更新を含む辞書
  • 保持: 上書きから保持するキーのリスト

この例で「levelA」値を保持するには、次のコードを使用できます。

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

このソリューションでは、予期しない変更を防ぐために、更新する前に辞書のコピーを作成します。これにより、部分的な更新後でも、元の辞書がそのまま残ることが保証されます。

以上がさまざまな深さで特定の値を保持しながら、Python でネストされた辞書を更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。