- 1 1. 소개
- 2 2. 사전 병합을 위한 기본 방법
- 3 3. 특수한 경우의 사전 병합
- 4 4. 딕셔너리 병합 시 주의사항
- 5 5. 방법 비교 및 선택 가이드
- 6 6. 자주 묻는 질문 (FAQ)
- 7 7. Summary
1. 소개
Python의 dict는 키‑값 쌍으로 데이터를 관리하기에 편리한 자료구조입니다. 여러 설정 파일을 병합하거나 서로 다른 데이터셋을 통합해야 하는 상황 등, 사전을 결합해야 할 경우가 많이 있습니다.
이 글에서는 Python에서 사전을 병합하는 다양한 방법을 자세히 설명합니다. 초보자부터 중급 사용자까지를 대상으로 기본 기법, Python 3.9에서 도입된 방법, 특수한 경우에 유용한 접근법을 다룹니다. 코드 예제를 통해 각 방법의 특징과 언제 사용하면 좋은지 살펴보겠습니다.
2. 사전 병합을 위한 기본 방법
Python은 사전을 병합하는 여러 방법을 제공합니다. 먼저 기본적인 방법들을 설명합니다.
2.1 update() 메서드 사용
특징
update() 메서드는 한 사전을 다른 사전에 병합하는 가장 기본적인 방법입니다. 이 연산은 파괴적(destructive)이며(원본 사전을 수정함) 원본 사전의 내용을 보존해야 할 경우 주의가 필요합니다.
코드 예시
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
dict1.update(dict2)
print(dict1) # {'a': 1, 'b': 3, 'c': 4}
설명
위 코드에서 dict2가 dict1에 병합됩니다. 키가 중복될 경우, 나중에 병합된 사전(dict2)의 값이 덮어쓰게 됩니다.
사용 사례
- 원본 사전을 수정해도 괜찮을 때
- 간단하고 효율적인 방법이 필요할 때

2.2 언패킹 연산자(**) 사용
특징
Python 3.5부터 언패킹 연산자(**)를 이용해 사전을 병합할 수 있습니다. 이 방법은 비파괴적이며(원본을 수정하지 않음) 새로운 사전을 생성합니다.
코드 예시
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined_dict = {**dict1, **dict2}
print(combined_dict) # {'a': 1, 'b': 3, 'c': 4}
설명
여러 사전을 언패킹하여 새로운 사전을 만듭니다. 키가 겹칠 경우, 뒤에 명시된 사전(dict2)의 값이 우선합니다.
사용 사례
- 원본을 건드리지 않고 새로운 사전이 필요할 때
- 가독성이 중요한 경우
2.3 병합 연산자(|) 사용
특징
Python 3.9부터 도입된 | 연산자를 사용하면 사전 병합을 간결하게 표현할 수 있습니다. 이 방법 역시 비파괴적이며 새로운 사전을 반환합니다.
코드 예시
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined_dict = dict1 | dict2
print(combined_dict) # {'a': 1, 'b': 3, 'c': 4}
설명
직관적인 방식으로 사전을 병합할 수 있습니다. 코드 가독성이 향상되고 Python 초보자도 이해하기 쉽습니다.
사용 사례
- Python 3.9 이상을 사용할 때
- 간단하고 이해하기 쉬운 문법이 필요할 때
3. 특수한 경우의 사전 병합
기본적인 사전 병합 방법을 살펴본 뒤, 이 섹션에서는 특수한 상황과 적용 기술을 설명합니다. 특정 상황에서 유용한 방법과 보다 고급 연산이 필요한 시나리오를 다룹니다.
3.1 dict() 생성자 사용
특징
dict() 생성자를 이용해 여러 사전을 병합합니다. 사전에 추가 값을 직접 지정하거나 언패킹된 사전을 포함한 새로운 사전을 만들고 싶을 때 유용합니다.
코드 예시
dict1 = {'a': 1, 'b': 2}
dict2 = {'c': 3}
combined_dict = dict(dict1, **dict2)
print(combined_dict) # {'a': 1, 'b': 2, 'c': 3}
설명
dict1을 기본으로 하고, 그 위에dict2를 언패킹하여 병합합니다.**연산자를 사용하므로dict2의 키는 문자열이어야 합니다.
사용 사례
- 기본 사전 병합 외에 새로운 키·값을 추가하고 싶을 때
- Python 3.5 이상이 필요합니다.
3.2 collections.ChainMap 사용
ChainMap 클래스는 Python 표준 라이브러리 collections 모듈에 포함되어 있으며, 여러 딕셔너리를 일시적으로 결합하여 조작할 때 유용합니다. 이 방법을 사용하면 딕셔너리가 병합되지 않고 원본 딕셔너리가 보존됩니다.
Code example
from collections import ChainMap
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined = ChainMap(dict1, dict2)
print(combined['b']) # 2
print(combined['c']) # 4
Explanation
ChainMap은 여러 딕셔너리를 하나의 가상 딕셔너리처럼 취급합니다.- 키 조회는 지정된 첫 번째 딕셔너리에서 우선적으로 수행됩니다. 이 예시에서
'b'에 대해서는dict1(2)의 값이 선택됩니다.
Use cases
- 딕셔너리를 실제로 병합하지 않고 동적으로 조작해야 할 때.
- 대량의 데이터를 다루면서 메모리 효율성을 우선시하고 싶을 때.

4. 딕셔너리 병합 시 주의사항
딕셔너리를 병합할 때 주의해야 할 점이 여러 가지 있습니다. 이를 이해하면 예상치 못한 오류와 데이터 불일치를 방지하는 데 도움이 됩니다.
4.1 중복 키의 동작
딕셔너리를 병합할 때 중복 키가 존재하면, 나중에 지정된 딕셔너리의 값이 우선합니다.
Example
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined = {**dict1, **dict2}
print(combined) # {'a': 1, 'b': 3, 'c': 4}
이 예시에서 키 'b'에 대해서는 dict2(3)의 값이 선택됩니다. 동작을 이해하는 것이 중요합니다.
4.2 성능 차이
딕셔너리를 병합하는 방법에 따라 성능이 달라질 수 있습니다. 대량의 데이터를 다룰 때는 특히 주의하세요.
Performance Comparison (Overview)
update()메서드는 효율적이지만 원본 딕셔너리를 수정하므로 백업을 유지해야 할 경우 부적합합니다.- 언팩 연산자 (
**)는 비파괴적이며 편리하지만, 대량 데이터를 처리할 때 메모리 사용량이 증가할 수 있습니다. ChainMap은 실제로 딕셔너리를 병합하지 않으므로 메모리 효율적입니다.
5. 방법 비교 및 선택 가이드
다양한 딕셔너리 병합 방법을 비교하고 적절한 접근 방식을 선택하기 위한 가이드를 제공합니다.
5.1 방법 비교 표
방법 | 파괴적/비파괴적 | Version | 중복 키 동작 | 성능 |
|---|---|---|---|---|
update() | 파괴적 | All versions | 후에 정의된 사전이 우선합니다 | 빠른 |
언패킹 연산자 ( | 비파괴적 | 3.5 이후 | 나중에 사전이 우선합니다 | 보통 |
Merge operator ( | 비파괴 | 3.9 이상 | 후에 사전이 우선합니다 | 보통 |
ChainMap | 비파괴 | All versions | 첫 번째 사전이 우선합니다 | 높은 메모리 효율성 |
5.2 선택 가이드
- Python 3.9 이상 :
|연산자는 간단하고 가독성이 높아 권장합니다.- Python 3.5–3.8 :
- 언팩 연산자 (
**)를 사용하는 것이 권장됩니다. - 대규모 데이터셋을 다루거나 메모리 효율성을 우선시하는 경우 :
ChainMap을 사용하는 것이 가장 좋습니다.- 파괴적인 연산이 허용되는 경우 :
update()메서드가 효율적입니다.

6. 자주 묻는 질문 (FAQ)
이 섹션에서는 파이썬에서 딕셔너리를 병합할 때 독자들이 흔히 갖는 질문을 다루고, 오류 원인 및 특수 상황 처리 방법을 설명합니다.
6.1 딕셔너리 병합 시 오류가 발생하는 이유는?
Problem example
다음 코드를 실행하면 오류가 발생합니다.
dict1 = {'a': 1, 'b': 2}
dict2 = {('c',): 3}
combined_dict = {**dict1, **dict2}
원인
언팩 연산자 (**)를 사용할 때 키는 문자열이어야 합니다; 그렇지 않으면 오류가 발생합니다. 위 예시에서 dict2의 키 ('c',)는 튜플이어서 오류가 발생합니다.
해결책
키가 문자열이 아닌 경우 update() 메서드를 사용하거나 루프를 통해 딕셔너리를 수동으로 병합하세요.
dict1 = {'a': 1, 'b': 2}
dict2 = {('c',): 3}
dict1.update(dict2) # Works correctly
print(dict1) # {'a': 1, 'b': 2, ('c',): 3}
6.2 Python 3.9 이전 버전에서 | 연산자를 사용하고 싶을 때 대안은?
답변
Python 3.9 이전 버전에서는 | 연산자를 사용할 수 없지만, 언팩 연산자 (**)를 사용하면 동일한 결과를 얻을 수 있습니다.
예시
Python 3.8 이하 버전에서는 다음 코드를 사용할 수 있습니다.
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
combined_dict = {**dict1, **dict2}
print(combined_dict) # {'a': 1, 'b': 3, 'c': 4}
6.3 중첩 딕셔너리를 어떻게 병합하나요?
Problem
중첩 딕셔너리를 병합할 때 일반적인 방법이 예상대로 작동하지 않을 수 있습니다.
dict1 = {'a': {'x': 1}}
dict2 = {'a': {'y': 2}}
combined_dict = {**dict1, **dict2}
print(combined_dict) # {'a': {'y': 2}}
위 예시에서 'a' 키는 dict2에 의해 덮어써지고, dict1의 값은 사라집니다.
Solution
중첩 딕셔너리를 병합하려면 재귀적인 접근이 필요합니다.
def merge_dicts(d1, d2):
result = d1.copy()
for key, value in d2.items():
if key in result and isinstance(result[key], dict) and isinstance(value, dict):
result[key] = merge_dicts(result[key], value)
else:
result[key] = value
return result
dict1 = {'a': {'x': 1}}
dict2 = {'a': {'y': 2}}
combined_dict = merge_dicts(dict1, dict2)
print(combined_dict) # {'a': {'x': 1, 'y': 2}}
6.4 병합 연산자를 사용하여 여러 딕셔너리를 한 번에 병합할 수 있나요?
Answer
Python 3.9 이후 버전에서는 여러 딕셔너리를 한 번에 병합할 때 병합 연산자를 연속해서 사용 합니다.
Example
dict1 = {'a': 1}
dict2 = {'b': 2}
dict3 = {'c': 3}
combined_dict = dict1 | dict2 | dict3
print(combined_dict) # {'a': 1, 'b': 2, 'c': 3}
언팩 연산자를 사용해도 동일한 결과를 얻을 수 있습니다.
combined_dict = {**dict1, **dict2, **dict3}
print(combined_dict) # {'a': 1, 'b': 2, 'c': 3}
6.5 대용량 데이터를 다룰 때 딕셔너리를 병합하는 가장 좋은 방법은 무엇인가요?
Answer
대용량 데이터셋을 다룰 때 ChainMap을 사용하면 효율적으로 병합할 수 있습니다. ChainMap은 실제로 딕셔너리를 결합하지 않으므로 메모리 사용량을 줄일 수 있습니다.
Example
from collections import ChainMap
dict1 = {'a': 1}
dict2 = {'b': 2}
combined = ChainMap(dict1, dict2)
print(combined['a']) # 1
print(combined['b']) # 2

7. Summary
이 문서에서는 Python에서 딕셔너리를 병합하는 다양한 방법을 설명했습니다. 기본적인 방법부터 최신 기법까지, 초보자도 이해하기 쉬운 구체적인 예시와 함께 다루었습니다.
Key points
update()메서드는 원본 딕셔너리를 수정하는 간단하고 효율적인 방법입니다.- 언팩 연산자 (
**)는 원본을 파괴하지 않으며 새로운 딕셔너리를 만들 때 유용합니다. - 병합 연산자 (
|)는 Python 3.9 이후에 사용할 수 있으며 코드를 더 간단하고 가독성 있게 만들어 줍니다. ChainMap은 대용량 데이터를 효율적으로 처리할 때 유용하며 메모리를 절약할 수 있습니다.
각 방법마다 고유한 특성이 있으므로 목표와 상황에 맞는 최적의 접근 방식을 선택하는 것이 중요합니다. 예를 들어 대용량 데이터를 처리하거나 딕셔너리 키 중복을 방지해야 할 때는 ChainMap이나 언팩 연산자가 효과적일 수 있습니다.
앞으로 실제 프로젝트에서 딕셔너리를 병합할 때는 이 문서에서 배운 방법들을 적용해 보세요. 실제 코드에 적용해 보는 것이 이해를 깊게 하는 가장 효과적인 방법입니다. 또한 Python 데이터 조작에 관한 다른 문서도 확인해 보시기 바랍니다.


