Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python – 첫 번째 값이 같은 튜플끼리 묶어 합계 구하기

튜플(tuple)은 파이썬의 기본 컬렉션 자료형 중 하나로, 순서는 있지만 한번 생성되면 변경할 수 없다는 특징을 가지고 있습니다. 실무에서 데이터를 다루다 보면 첫 번째 요소가 서로 동일한 여러 개의 튜플을 만나게 되는데, 이럴 때 첫 번째 요소가 같은 튜플들의 두 번째 요소를 모두 합산해야 하는 상황이 자주 발생합니다.

예를 들어 (7, 31)(7, 50)처럼 앞자리가 같은 튜플이 있다면, 이를 하나로 묶어 (7, 81)로 만드는 작업입니다. 이 글에서는 두 가지 방법을 소개합니다.

1. map 함수와 for 루프 활용하기

이 방법은 다음과 같은 흐름으로 진행됩니다.

  • 먼저 튜플로 구성된 리스트를 준비합니다.
  • 딕셔너리 컴프리헨션으로 리스트를 딕셔너리로 변환하여 튜플의 요소를 키-값 쌍으로 연결합니다.
  • for 루프를 돌면서 딕셔너리의 각 키에 해당하는 값을 계속 누적해 더합니다.
  • 마지막으로 map 함수를 사용해 합산된 값들을 다시 리스트 형태로 변환합니다.

예제 코드

List = [(3,19),(7, 31), (7, 50), (1, 25.5), (1, 12)]
# 리스트를 딕셔너리로 변환
tup = {i:0 for i, v in List}
for key, value in List:
    tup[key] = tup[key]+value
# map 함수로 리스트 변환
result = list(map(tuple, tup.items()))
print(result)

위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.

출력 결과

[(3, 19), (7, 81), (1, 37.5)]

출력을 보면 첫 번째 요소가 7인 튜플들은 두 번째 값이 31 + 50 = 81로 합쳐졌고, 1인 튜플들도 25.5 + 12 = 37.5로 정상적으로 병합된 것을 확인할 수 있습니다.

2. collections 모듈의 defaultdict 활용하기

두 번째 방법은 위와 유사한 접근 방식을 사용하지만, collections 모듈의 defaultdict를 활용한다는 점이 다릅니다. defaultdict(int)로 선언하면 존재하지 않는 키에 접근할 때 자동으로 0으로 초기화되기 때문에, 별도의 초기화 과정 없이 바로 누적 합산을 시작할 수 있어 코드가 더 간결해집니다. 또한 map 함수 대신 딕셔너리의 아이템에 직접 접근하여 리스트로 변환합니다.

예제 코드

from collections import defaultdict

# 튜플 리스트
List = [(3,19),(7, 31), (7, 50), (1, 25.5), (1, 12)]

dict = defaultdict(int)
for key, value in List:
    dict[key] = dict[key]+value

# 결과 출력
print(list(dict.items()))

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

출력 결과

[(3, 19), (7, 81), (1, 37.5)]

마치며

두 방법 모두 동일한 결과를 반환하지만, defaultdict를 사용하는 방식이 키 초기화를 자동으로 처리해 주기 때문에 코드가 더 짧고 직관적이라는 장점이 있습니다. 반면 외부 모듈 임포트 없이 순수 파이썬 문법만으로 해결하고 싶다면 첫 번째 방법이 적합합니다. 상황과 취향에 맞게 선택하여 사용하시면 됩니다.