파이썬으로 데이터를 분석하다 보면 두 개의 딕셔너리를 하나로 합쳐야 하는 상황에 자주 마주하게 됩니다. 특히 키가 동일한 요소끼리는 값을 서로 더하는 방식으로 병합해야 할 때가 있는데요. 이 글에서는 그런 경우에 사용할 수 있는 대표적인 두 가지 방법을 예제 코드와 함께 살펴보겠습니다.
방법 1: for 루프와 | 연산자 활용
첫 번째 방법은 for 루프를 사용해 두 딕셔너리에 같은 키가 존재하는지 확인하고, 존재한다면 해당 키의 값들을 더하는 방식입니다. 이후 파이썬 3.9부터 딕셔너리에 사용할 수 있는 |(병합) 연산자를 이용해 두 딕셔너리를 최종적으로 합칩니다.
예제 코드
dictA = {'Mon': 23, 'Tue': 11, 'Sun': 6}
dictB = {'Wed': 10, 'Mon': 12, 'Sun': 4}
# 공통 키의 값 더하기
for key in dictB:
if key in dictA:
dictB[key] = dictB[key] + dictA[key]
else:
pass
res = dictA | dictB
print(res)위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
실행 결과
{'Mon': 35, 'Tue': 11, 'Sun': 10, 'Wed': 10}
'Mon'은 23 + 12 = 35, 'Sun'은 6 + 4 = 10으로 공통 키의 값이 정상적으로 합산된 것을 확인할 수 있으며, 한쪽에만 존재하는 'Tue'와 'Wed'는 원래 값이 그대로 유지됩니다.
방법 2: Counter 활용
두 번째 방법은 collections 모듈의 Counter 클래스를 사용하는 것입니다. Counter 객체는 덧셈 연산을 지원하기 때문에, 두 딕셔너리를 각각 Counter로 변환한 뒤 더해주기만 하면 공통 키의 값이 자동으로 합산되고 고유한 키도 그대로 보존됩니다. 코드가 훨씬 간결하다는 장점이 있습니다.
예제 코드
from collections import Counter
dictA = {'Mon': 23, 'Tue': 11, 'Sun': 6}
dictB = {'Wed': 10, 'Mon': 12, 'Sun': 4}
res = Counter(dictA) + Counter(dictB)
print(res)위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
실행 결과
Counter({'Mon': 35, 'Tue': 11, 'Sun': 10, 'Wed': 10})
결과가 일반 딕셔너리가 아닌 Counter 객체로 출력된다는 점에 유의하세요. 필요하다면 dict(res)처럼 감싸서 일반 딕셔너리 형태로 변환할 수 있습니다.
정리
두 방법 모두 공통 키의 값을 정확히 더해주지만, 상황에 따라 선택 기준이 달라집니다. 로직을 명시적으로 제어하고 싶다면 for 루프 방식이, 간결하고 가독성 좋은 코드를 원한다면 Counter 방식이 적합합니다. 참고로 Counter 방식은 값이 반드시 숫자여야 하며, 음수나 0인 값은 결과에서 제외될 수 있다는 점도 함께 기억해 두면 좋습니다.