파이썬에서는 리스트의 요소로 튜플을 자유롭게 사용할 수 있습니다. 이 글에서는 리스트에 포함된 각 튜플이 몇 번 나타나는지, 즉 고유한 튜플의 발생 횟수를 계산하는 두 가지 대표적인 방법을 소개합니다.
1. defaultdict 활용하기
collections 모듈의 defaultdict를 사용하면 주어진 리스트를 데이터 컨테이너처럼 다루면서 각 튜플의 등장 횟수를 손쉽게 셀 수 있습니다. defaultdict(int)는 존재하지 않는 키에 접근할 때 자동으로 기본값 0을 생성해 주기 때문에, 별도의 초기화 과정 없이 바로 카운트를 누적할 수 있다는 장점이 있습니다.
예제 코드
import collections
Alist = [[('Mon', 'Wed')], [('Mon')], [('Tue')],[('Mon', 'Wed')] ]
# 주어진 리스트
print("Given list:\n", Alist)
res = collections.defaultdict(int)
for elem in Alist:
res[elem[0]] += 1
print("Count of tuples present in the list:\n",res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given list:
[[('Mon', 'Wed')], ['Mon'], ['Tue'], [('Mon', 'Wed')]]
Count of tuples present in the list:
defaultdict(, {('Mon', 'Wed'): 2, 'Mon': 1, 'Tue': 1})2. Counter와 chain 조합하기
Counter는 collections 모듈에, chain은 itertools 모듈에 포함된 도구입니다. 이 둘을 함께 사용하면 중첩된 리스트를 하나의 시퀀스로 펼친 뒤 각 튜플의 개수를 한 번에 집계할 수 있어, 반복문 없이도 코드를 매우 간결하게 작성할 수 있습니다.
예제 코드
from collections import Counter
from itertools import chain
Alist = [[('Mon', 'Wed')], [('Mon')], [('Tue')],[('Mon', 'Wed')] ]
# 주어진 리스트
print("Given list:\n", Alist)
res = Counter(chain(*Alist))
print("Count of tuples present in the list:\n",res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given list:
[[('Mon', 'Wed')], ['Mon'], ['Tue'], [('Mon', 'Wed')]]
Count of tuples present in the list:
Counter({('Mon', 'Wed'): 2, 'Mon': 1, 'Tue': 1})두 방법의 차이점
defaultdict 방식은 반복문을 직접 작성해야 하지만, 카운팅 로직을 자유롭게 확장하거나 조건을 추가할 때 유연하게 대응할 수 있습니다. 반면 Counter와 chain을 조합하면 단 한 줄로 집계가 완료되므로 가독성과 생산성 면에서 더욱 유리합니다. 간단한 빈도 분석이나 대량의 데이터를 처리할 때는 Counter 방식을 사용하는 것을 추천합니다.