개요
리스트 안의 리스트(2차원 리스트)에서 모든 요소의 등장 횟수(빈도)가 K보다 큰 행만 골라내야 하는 경우가 있습니다. 이럴 때는 조건을 검사하는 함수를 정의한 뒤, 파이썬의 내장 함수 all()과 반복문을 활용하면 간단하게 해결할 수 있습니다.
아래에서 실제 동작 예제와 함께 단계별로 살펴보겠습니다.
예제 코드
def frequency_greater_K(row, K):
return all(row.count(element) > K for element in row)
my_list = [[11, 11, 32, 43, 12, 23], [42, 14, 55, 62, 16], [11, 11, 11, 11], [42, 54, 61, 18]]
print("The tuple is :")
print(my_list)
K = 1
print("The value of K is :")
print(K)
my_result = [row for row in my_list if frequency_greater_K(row, K)]
print("The result is :")
print(my_result)실행 결과
The tuple is : [[11, 11, 32, 43, 12, 23], [42, 14, 55, 62, 16], [11, 11, 11, 11], [42, 54, 61, 18]] The value of K is : 1 The result is : [[11, 11, 11, 11]]
코드 설명
frequency_greater_K라는 이름의 함수를 정의합니다. 이 함수는 행(row)과 기준값(K)을 매개변수로 받으며, 각 요소의 개수(row.count(element))가 K보다 큰지를 검사한 결과를 반환합니다.all()함수는 모든 요소에 대해 조건식이 참일 때만True를 반환하기 때문에, 행 전체의 요소가 조건을 만족하는지 한 번에 확인할 수 있습니다.2차원 리스트를 정의하고 콘솔에 출력하여 초기 상태를 보여줍니다.
리스트 컴프리헨션(list comprehension)을 사용해 리스트의 각 행을 순회하면서, 앞서 정의한 함수를 호출해 조건을 만족하는 행만 필터링합니다.
필터링된 결과는 변수
my_result에 할당되며, 최종적으로 콘솔에 출력됩니다.
결과 분석
위 예제에서 K는 1이므로, 각 요소가 최소 2번 이상 등장해야 조건을 만족합니다. 네 개의 행 중 [11, 11, 11, 11]만 모든 요소가 4번씩 등장하므로 유일하게 결과에 포함됩니다. 나머지 행들은 고유한 요소가 포함되어 있어(빈도가 1) 조건에서 제외된 것입니다.
마무리
이처럼 all()과 리스트 컴프리헨션을 조합하면 복잡한 반복문 없이도 간결하고 가독성 높은 코드로 원하는 조건의 데이터를 추출할 수 있습니다. 다만 요소 개수가 매우 많은 경우에는 collections.Counter를 사용해 미리 빈도를 계산하는 방식이 더 효율적일 수 있다는 점도 참고하시기 바랍니다.