리스트에 포함된 요소들의 누적 행 빈도(cumulative row frequency)를 계산해야 하는 경우, collections 모듈의 Counter 메서드와 리스트 컴프리헨션(list comprehension)을 함께 사용하면 간단하게 해결할 수 있습니다.
Counter란?
Counter는 해시 가능한(hashable) 객체를 키로, 그 개수를 값으로 저장하는 딕셔너리의 하위 클래스입니다. 리스트 내 각 요소가 몇 번 등장하는지 손쉽게 집계할 수 있어 빈도 계산에 매우 유용합니다.
예제 코드
다음은 중첩 리스트(리스트의 리스트)에서 특정 요소들이 각 행마다 몇 번 나타나는지 누적하여 계산하는 예제입니다.
from collections import Counter
my_list = [[11, 2, 32, 4, 31], [52, 52, 3, 71, 71, 3], [1, 3], [19, 19, 40, 40, 40]]
print("입력 리스트 :")
print(my_list)
my_element_list = [19, 2, 71]
# 각 행별로 요소의 빈도를 Counter 객체로 생성
my_frequency = [Counter(element) for element in my_list]
# 찾고자 하는 요소들이 각 행에 등장한 총 횟수를 합산
my_result = [sum([freq[word] for word in my_element_list if word in freq]) for freq in my_frequency]
print("결과 행렬 :")
print(my_result)실행 결과
입력 리스트 : [[11, 2, 32, 4, 31], [52, 52, 3, 71, 71, 3], [1, 3], [19, 19, 40, 40, 40]] 결과 행렬 : [1, 2, 0, 2]
코드 설명
collections모듈에서Counter클래스를 임포트합니다.중첩 리스트를 정의하고 콘솔에 출력하여 확인합니다.
빈도를 세고 싶은 대상 요소들을 담은 정수 리스트(
[19, 2, 71])를 별도로 정의합니다.리스트 컴프리헨션을 사용해 각 행을 순회하면서
Counter로 해당 행의 요소별 빈도를 계산하고, 그 결과를 변수에 할당합니다.다시 한 번 리스트 컴프리헨션으로 각 행의 빈도 정보를 순회하며, 대상 요소가 해당 행에 존재하는 경우에만 그 빈도 값을 더해 누적 합계를 구합니다.
최종 결과를 변수에 저장한 뒤 콘솔에 출력합니다.
결과 해석
결과 리스트 [1, 2, 0, 2]를 보면 다음과 같이 해석할 수 있습니다.
첫 번째 행
[11, 2, 32, 4, 31]에는 대상 요소 중2가 1번 포함되어 있으므로 결과는 1입니다.두 번째 행
[52, 52, 3, 71, 71, 3]에는71이 2번 포함되어 있으므로 결과는 2입니다.세 번째 행
[1, 3]에는 대상 요소가 하나도 없으므로 결과는 0입니다.네 번째 행
[19, 19, 40, 40, 40]에는19가 2번 포함되어 있으므로 결과는 2입니다.
이처럼 Counter와 리스트 컴프리헨션을 조합하면 반복문을 복잡하게 작성하지 않고도 간결하고 가독성 좋은 코드로 누적 빈도를 계산할 수 있습니다.