다양한 깊이에서 특정 값을 유지하면서 Python에서 중첩 사전을 업데이트하는 방법은 무엇입니까?

Linda Hamilton
풀어 주다: 2024-11-12 03:58:02
원래의
1037명이 탐색했습니다.

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

깊이 보존을 사용한 중첩 사전 업데이트

Python에서 중첩 사전을 업데이트하는 것은 까다로울 수 있으며, 특히 내용을 다음과 병합하려는 경우 더욱 그렇습니다. 다른 깊이에서 특정 값을 유지하면서 다른 사전. 다음 시나리오를 고려하십시오.

dictionary1과 update라는 두 개의 사전이 있는 경우, 다른 모든 값을 업데이트하는 동안 가장 깊은 수준(예: "levelA")의 특정 값을 덮어쓰지 않고 update 내용으로 Dictionary1을 업데이트할 수 있는 방법은 무엇입니까? ?

dictionary1 = {
    "level1": {
        "level2": {"levelA": 0, "levelB": 1}
    }
}
update = {
    "level1": {
        "level2": {"levelB": 10}
    }
}
로그인 후 복사

업데이트 방법을 사용하면 전체 "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 함수는 세 가지 인수를 사용합니다.

  • d: 업데이트할 사전
  • u: 업데이트가 포함된 사전
  • preserve: 덮어쓰기로부터 보존할 키 목록

이 예에서 "levelA" 값을 유지하려면 다음 코드를 사용할 수 있습니다.

partial_update(dictionary1, update, ["levelA"])
print(dictionary1)
로그인 후 복사
{
    "level1": {
        "level2": {"levelA": 0, "levelB": 10}
    }
}
로그인 후 복사

이 솔루션에서는 예기치 않은 수정을 방지하기 위해 업데이트하기 전에 사전 사본을 만듭니다. 이렇게 하면 부분 업데이트 후에도 원래 사전이 그대로 유지됩니다.

위 내용은 다양한 깊이에서 특정 값을 유지하면서 Python에서 중첩 사전을 업데이트하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿