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

파이썬 리스트에서 특정 요소의 빈도 합계 구하기 — sum()과 Counter 완전 정리

실무에서 리스트를 다루다 보면 중복된 요소가 여러 번 포함된 경우가 자주 있습니다. 이럴 때 특정 요소들이 리스트에 각각 몇 번 등장하는지(빈도)를 확인하고, 그 빈도들의 합계를 구해야 하는 경우가 생깁니다.

예를 들어 요일 데이터가 담긴 리스트에서 '월요일'과 '화요일'이 총 몇 번 나타나는지 계산하는 상황을 생각해 볼 수 있습니다. 이 글에서는 파이썬으로 이 문제를 해결하는 대표적인 두 가지 방법을 예제 코드와 함께 살펴보겠습니다.

방법 1: sum() 함수와 count() 조합

가장 직관적인 방법은 내장 함수인 sum()과 리스트 메서드인 count()를 조합하는 것입니다. 두 개의 리스트가 필요한데, 하나는 분석 대상이 되는 전체 리스트(big_list), 다른 하나는 빈도를 확인할 요소들의 목록(chk_list)입니다.

for 루프(여기서는 제너레이터 표현식)로 chk_list의 각 요소가 big_list에 몇 번 등장하는지 센 뒤, sum()으로 최종 합계를 구합니다.

예제 코드

chk_list = ['Mon', 'Tue']
big_list = ['Mon', 'Tue', 'Wed', 'Mon', 'Mon', 'Tue']

# sum 적용
res = sum(big_list.count(elem) for elem in chk_list)

# 결과 출력
print("분석 대상 리스트:\n", big_list)
print("빈도를 확인할 요소 목록:\n", chk_list)
print("빈도의 합계:", res)

실행 결과

분석 대상 리스트:
['Mon', 'Tue', 'Wed', 'Mon', 'Mon', 'Tue']
빈도를 확인할 요소 목록:
['Mon', 'Tue']
빈도의 합계: 5

'Mon'은 3번, 'Tue'는 2번 등장했으므로 빈도의 합계는 3 + 2 = 5가 됩니다.

방법 2: collections.Counter 활용

collections 모듈의 Counter 클래스를 사용하면 같은 결과를 더 깔끔하게 얻을 수 있습니다. Counter는 리스트를 한 번 순회하면서 모든 요소의 등장 횟수를 딕셔너리 형태로 미리 계산해 줍니다. 따라서 빈도를 확인할 요소들을 순회하며 해당 키의 값을 조회하기만 하면 됩니다.

예제 코드

from collections import Counter

chk_list = ['Mon', 'Tue']
big_list = ['Mon', 'Tue', 'Wed', 'Mon', 'Mon', 'Tue']

# Counter 적용
res = sum(Counter(big_list)[x] for x in chk_list)

# 결과 출력
print("분석 대상 리스트:\n", big_list)
print("빈도를 확인할 요소 목록:\n", chk_list)
print("빈도의 합계:", res)

실행 결과

분석 대상 리스트:
['Mon', 'Tue', 'Wed', 'Mon', 'Mon', 'Tue']
빈도를 확인할 요소 목록:
['Mon', 'Tue']
빈도의 합계: 5

어떤 방법을 선택해야 할까?

두 방법 모두 동일한 결과를 반환하지만, 성능 측면에서 차이가 있습니다. list.count()는 호출될 때마다 리스트 전체를 처음부터 끝까지 탐색하기 때문에, 확인할 요소가 많거나 리스트가 클 경우 시간이 오래 걸릴 수 있습니다. 반면 Counter는 리스트를 한 번만 순회해 모든 빈도를 미리 계산해 두므로, 대량의 데이터를 처리할 때 더 효율적입니다.

  • 간단한 소규모 데이터: sum() + count() 조합으로 충분히 가독성 있게 해결 가능
  • 대용량 데이터 또는 다수의 요소 확인: Counter 사용 권장

참고로 Counter 객체에 존재하지 않는 키를 조회하면 에러 없이 0을 반환하므로, 빈도 확인 대상 요소가 원본 리스트에 없는 경우에도 안전하게 동작한다는 장점도 있습니다.