리스트와 튜플이 함께 주어졌을 때, 리스트의 요소들이 튜플 안에서 몇 번 나타나는지 확인해야 하는 경우가 있습니다. 예를 들어 요일 데이터가 담긴 튜플에서 특정 요일이 몇 번 등장하는지 세는 상황을 생각할 수 있습니다. 이번 글에서는 파이썬으로 이를 해결하는 두 가지 대표적인 방법을 살펴보겠습니다.
1. Counter 활용하기
collections 모듈의 Counter 클래스를 사용하면 튜플에 포함된 각 요소의 등장 횟수를 한 번에 구할 수 있습니다. 이후 for 문과 in 연산자를 조합해, 리스트에 있는 요소 중 튜플 카운트 결과에 존재하는 항목들의 개수를 모두 더하면 됩니다.
예제 코드
from collections import Counter
Atup = ('Mon', 'Wed', 'Mon', 'Tue', 'Thu')
Alist = ['Mon', 'Thu']
# 주어진 튜플과 리스트 출력
print("Given tuple :\n", Atup)
print("Given list :\n", Alist)
cnt = Counter(Atup)
res = sum(cnt[i] for i in Alist)
print("Number of list elements in the tuple: \n", res)
실행 결과
Given tuple :
('Mon', 'Wed', 'Mon', 'Tue', 'Thu')
Given list :
['Mon', 'Thu']
Number of list elements in the tuple:
3
Counter(Atup)는 튜플의 각 요소별 개수를 딕셔너리 형태로 반환합니다. 이후 리스트의 각 요소에 대해 해당 개수를 조회한 뒤 합산하는데, 위 예제에서는 'Mon'이 2번, 'Thu'가 1번 등장하므로 최종 결과는 3이 됩니다.
2. sum() 함수 활용하기
두 번째 방법은 sum() 함수와 제너레이터 표현식을 함께 사용하는 것입니다. 튜플의 각 값을 순회하면서 해당 값이 리스트에 존재하면 1을, 존재하지 않으면 0을 더하는 방식으로, 리스트에 포함된 요소만 골라 개수를 집계할 수 있습니다.
참고로 리스트를 set()으로 변환하면 중복이 제거될 뿐만 아니라 멤버십 검사(in 연산) 속도도 크게 향상되므로, 데이터 크기가 클 때 특히 유용합니다.
예제 코드
Atup = ('Mon', 'Wed', 'Mon', 'Tue', 'Thu')
Alist = ['Mon', 'Thu', 'Mon']
Alist = set(Alist) # 중복 제거 및 빠른 탐색을 위해 set으로 변환
# 주어진 튜플과 리스트 출력
print("Given tuple :\n", Atup)
print("Given list :\n", Alist)
res = sum(1 for x in Atup if x in Alist)
print("Number of list elements in the tuple: \n", res)
실행 결과
Given tuple :
('Mon', 'Wed', 'Mon', 'Tue', 'Thu')
Given list :
{'Mon', 'Thu'}
Number of list elements in the tuple:
3
두 방식 모두 동일하게 3이라는 결과를 반환합니다. 다만 성능 측면에는 차이가 있습니다. Counter는 튜플을 한 번만 순회해 전체 빈도를 미리 계산하는 반면, sum() 방식은 매번 멤버십 검사를 수행합니다. 따라서 같은 튜플에 대해 여러 리스트의 개수를 반복적으로 구해야 하는 상황이라면 Counter 객체를 미리 만들어 두는 것이 더 효율적입니다.