두 개의 튜플 리스트가 있을 때, 하나의 리스트를 기준으로 다른 리스트의 값을 반영하여 업데이트(병합)해야 하는 경우가 자주 있습니다. 이럴 때 Python의 collections 모듈에 포함된 defaultdict를 활용하면 매우 간결하고 효율적으로 처리할 수 있습니다.
defaultdict란 무엇인가?
defaultdict는 일반 딕셔너리(dict)와 유사하게 동작하는 컨테이너 클래스로, dict 클래스의 하위 클래스입니다. 일반 딕셔너리와 달리 존재하지 않는 키에 접근하더라도 KeyError를 발생시키지 않고, 미리 지정한 기본값(default)을 자동으로 생성해 줍니다. 덕분에 키의 존재 여부를 매번 확인하는 번거로움 없이 코드를 작성할 수 있습니다.
예제 코드
아래 예제에서는 두 개의 튜플 리스트를 병합하고, 같은 키에 여러 값이 있을 경우 최댓값만 남기도록 처리합니다.
from collections import defaultdict
def merge_vals(list_1, list_2):
my_dict = defaultdict(list)
for i, j in list_1 + list_2:
my_dict[i].append(j)
return sorted([(i, max(j)) for i, j in my_dict.items()],
key = lambda x:x[0])
my_list_1 = [('v', 1), ('q', 2), ('o', 0)]
my_list_2 = [('q', 5), ('o', 3)]
print("The first list of tuple is : ")
print(my_list_1)
print("The second list of tuple is : ")
print(my_list_2)
print("After merging, it becomes : ")
print(merge_vals(my_list_1, my_list_2))
실행 결과
The first list of tuple is :
[('v', 1), ('q', 2), ('o', 0)]
The second list of tuple is :
[('q', 5), ('o', 3)]
After merging, it becomes :
[('o', 3), ('q', 5), ('v', 1)]
코드 동작 원리 상세 설명
- 모듈 임포트:
collections모듈에서defaultdict를 가져옵니다. - 함수 정의: 두 개의 리스트를 인자로 받는
merge_vals함수를 정의하고, 그 안에서 값 타입이 리스트인defaultdict객체를 생성합니다. - 데이터 병합: 두 리스트를 연결한 뒤 순회하면서, 각 튜플의 첫 번째 요소를 키(key)로 사용하고 두 번째 요소를 해당 키의 리스트에 추가(append)합니다.
- 최댓값 추출 및 정렬: 딕셔너리의 각 항목에 대해 최댓값만 남긴 튜플을 만들고, 키를 기준으로 오름차순 정렬하여 반환합니다.
- 결과 출력: 두 개의 튜플 리스트를 생성해 콘솔에 출력한 후,
merge_vals함수를 호출하여 병합된 최종 결과를 화면에 표시합니다.
마무리
이처럼 defaultdict를 사용하면 키 존재 여부 검사 없이 데이터를 손쉽게 그룹화하고 병합할 수 있습니다. 특히 중복 키가 많은 대량의 데이터를 다룰 때 코드의 가독성과 성능을 모두 향상시킬 수 있는 유용한 패턴이므로, 실무에서도 적극적으로 활용해 보시기 바랍니다.