행렬(2차원 리스트)에서 모든 요소의 등장 빈도가 짝수인 행만 골라내야 하는 경우, 리스트 컴프리헨션(list comprehension)과 함께 내장 함수 all() 그리고 collections.Counter 메서드를 활용하면 간단하게 해결할 수 있습니다.
예제 코드
아래는 실제 동작을 보여주는 예제입니다.
from collections import Counter
my_list = [[41, 25, 25, 62], [41, 41, 41, 41, 22, 22], [65, 57, 65, 57], [11, 24, 36, 48]]
print("리스트는 다음과 같습니다 :")
print(my_list)
my_result = [sub for sub in my_list if all(value % 2 == 0 for key, value in list(dict(Counter(sub)).items()))]
print("결과는 다음과 같습니다 :")
print(my_result)실행 결과
리스트는 다음과 같습니다 : [[41, 25, 25, 62], [41, 41, 41, 41, 22, 22], [65, 57, 65, 57], [11, 24, 36, 48]] 결과는 다음과 같습니다 : [[41, 41, 41, 41, 22, 22], [65, 57, 65, 57]]
코드 설명
먼저 리스트 안에 리스트가 포함된 중첩 리스트(행렬)를 정의한 뒤, 콘솔에 출력합니다.
리스트 컴프리헨션을 사용해 각 행(부분 리스트)을 순회하면서,
all()연산자로 해당 행의 모든 값이 2로 나누어 떨어지는지 검사합니다.Counter는 각 요소가 몇 번 등장했는지 빈도를 계산하며,dict()로 변환하면 {요소: 빈도} 형태의 딕셔너리가 됩니다.items()를 통해 키(요소)와 값(빈도) 쌍을 가져오고, 값이 모두 짝수인 행만 최종 결과 리스트에 담아 변수에 할당합니다.마지막으로 필터링된 결과를 콘솔에 출력합니다.
핵심 정리
이 예제에서 첫 번째 행 [41, 25, 25, 62]는 41이 한 번만 등장하므로 제외되고, 네 번째 행 [11, 24, 36, 48] 역시 모든 요소가 한 번씩만 나타나기 때문에 제외됩니다. 반면 두 번째 행과 세 번째 행은 각 요소가 짝수 번 등장하므로 결과에 포함됩니다. 이처럼 Counter와 all()을 조합하면 복잡한 조건의 데이터 필터링도 짧고 읽기 쉬운 코드로 처리할 수 있습니다.