개요
이번 튜토리얼에서는 서로 다른 리스트에 흩어져 있는 튜플들을 키를 기준으로 그룹화하여, 같은 키를 가진 값들을 모두 합산하는 프로그램을 작성해 보겠습니다.
예를 들어 아래와 같이 두 개의 리스트가 있을 때,
list_one = [('a', 2), ('b', 3), ('c', 5)]
list_two = [('c', 7), ('a', 4), ('b', 2)]키 'a', 'b', 'c'별로 값을 각각 더하면 다음과 같은 결과를 얻을 수 있습니다.
[('a', 6), ('b', 5), ('c', 12)]방법 1: 딕셔너리 활용
문제 해결 단계
- 두 개의 리스트를 초기화합니다.
dict()함수를 사용해 첫 번째 리스트를 딕셔너리로 변환합니다.- 두 번째 리스트를 순회하면서, 해당 키가 딕셔너리에 존재하면 기존 값에 새 값을 누적해 더합니다.
- 최종 결과를 출력합니다.
코드 예제
# 리스트 초기화
list_one = [('a', 2), ('b', 3), ('c', 5)]
list_two = [('c', 7), ('a', 4), ('b', 2)]
# list_one을 딕셔너리로 변환
result = dict(list_one)
# 두 번째 리스트 순회
for tup in list_two:
# 딕셔너리에 해당 키가 있는지 확인
if tup[0] in result:
result[tup[0]] = result.get(tup[0]) + tup[1]
# 결과를 튜플 리스트 형태로 출력
print(list(result.items()))실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
[('a', 6), ('b', 5), ('c', 12)]방법 2: collections.Counter 활용
리스트를 일일이 순회하지 않고도 collections 모듈의 Counter를 사용하면 같은 문제를 훨씬 간결하게 해결할 수 있습니다. Counter 객체끼리 + 연산자를 적용하면 동일한 키의 값들이 자동으로 합산되기 때문입니다.
코드 예제
# Counter 임포트
from collections import Counter
# 리스트 초기화
list_one = [('a', 2), ('b', 3), ('c', 5)]
list_two = [('c', 7), ('a', 4), ('b', 2)]
# Counter 객체끼리 더해 결과 계산
result = Counter(dict(list_one)) + Counter(dict(list_two))
# 결과를 튜플 리스트 형태로 출력
print(list(result.items()))실행 결과
위 코드를 실행하면 동일한 결과를 확인할 수 있습니다.
[('a', 6), ('b', 5), ('c', 12)]마무리
지금까지 파이썬에서 키가 같은 튜플 값들을 그룹화해 합산하는 두 가지 방법을 살펴보았습니다. 데이터 구조를 직접 제어하고 싶다면 딕셔너리 방식이 적합하고, 코드를 더 짧고 읽기 쉽게 유지하고 싶다면 Counter를 활용하는 것이 좋습니다. 튜토리얼 내용에 대해 궁금한 점이 있다면 댓글로 남겨주세요!