Problem
이제 여러 사전이나 맵이 있는데 이를 논리적으로 단일 맵으로 병합한 다음 값을 조회하거나 특정 키가 존재하는지 확인하는 등의 특정 작업을 수행하려고 합니다.
Solution
Join에는 다음 두 개의 사전이 있습니다.
a = {'x': 1, 'z': 3 } b = {'y': 2, 'z': 4 }
이제 두 개의 사전에서 검색 작업을 수행해야 한다고 가정합니다(예: 첫 번째 사전에서 검색한 다음 찾지 못한 경우 b에서 검색). ). 매우 간단한 해결책은 컬렉션 모듈의 ChainMap 클래스를 사용하는 것입니다. 예:
from collections import ChainMap c = ChainMap(a,b) print(c['x']) # Outputs 1 (from a) print(c['y']) # Outputs 2 (from b) print(c['z']) # Outputs 3 (from a)
Discuss
A ChainMap은 여러 사전을 허용하고 논리적으로 하나의 사전으로 변환합니다. 그러나 이러한 사전은 실제로 함께 병합되지 않습니다. ChainMap 클래스는 이러한 사전을 보유하기 위해 내부적으로 목록을 생성하고 이 목록을 탐색하기 위해 몇 가지 일반적인 사전 작업을 재정의합니다. 대부분의 사전 작업은 다음과 같이 정상적으로 사용할 수 있습니다.
>>> len(c) 3 >>> list(c.keys()) ['x', 'y', 'z'] >>> list(c.values()) [1, 2, 3] >>>
중복 키가 있는 경우 매핑된 값이 처음으로 나타나는 것이 반환됩니다. 따라서 예제 프로그램의 c['z']는 항상 b의 해당 값이 아닌 사전 a의 해당 값을 반환합니다.
사전을 업데이트하거나 삭제하면 항상 목록의 첫 번째 사전에 영향을 미칩니다. 예:
>>> c['z'] = 10 >>> c['w'] = 40 >>> del c['x'] >>> a {'w': 40, 'z': 10} >>> del c['y'] Traceback (most recent call last): ... KeyError: "Key not found in the first mapping: 'y'" >>>
ChainMap은 프로그래밍 언어의 범위 변수(예: 전역, 지역 등)에 매우 유용합니다. 실제로 이를 쉽게 만드는 방법이 있습니다:
>>> values = ChainMap() >>> values['x'] = 1 >>> # Add a new mapping >>> values = values.new_child() >>> values['x'] = 2 >>> # Add a new mapping >>> values = values.new_child() >>> values['x'] = 3 >>> values ChainMap({'x': 3}, {'x': 2}, {'x': 1}) >>> values['x'] 3 >>> # Discard last mapping >>> values = values.parents >>> values['x'] 2 >>> # Discard last mapping >>> values = values.parents >>> values['x'] 1 >>> values ChainMap({'x': 1}) >>>
ChainMap의 대안으로 update() 메서드를 사용하여 두 사전을 병합하는 것을 고려할 수 있습니다. 예:
>>> a = {'x': 1, 'z': 3 } >>> b = {'y': 2, 'z': 4 } >>> merged = dict(b) >>> merged.update(a) >>> merged['x'] 1 >>> merged['y'] 2 >>> merged['z'] 3 >>>
이 방법도 작동하지만 완전히 다른 사전 개체를 생성해야 합니다(또는 기존 사전 구조를 파괴해야 합니다). 동시에 원본 사전이 업데이트되면 이 변경 사항은 새로 병합된 사전에 반영되지 않습니다. 예:
>>> a['x'] = 13 >>> merged['x'] 1
ChianMap은 원래 사전을 사용하며 자체적으로 새 사전을 생성하지 않습니다. 따라서 위에서 언급한 다음과 같은 결과가 생성되지 않습니다.
>>> a = {'x': 1, 'z': 3 } >>> b = {'y': 2, 'z': 4 } >>> merged = ChainMap(a, b) >>> merged['x'] 1 >>> a['x'] = 42 >>> merged['x'] # Notice change to merged dicts 42 >>>
권장 튜토리얼: "Python Tutorial"
위 내용은 Python 여러 사전 병합 또는 매핑 튜토리얼의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!