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

Python – 특정 요소를 모두 포함하는 행만 골라내는 필터링 방법

중첩 리스트(2차원 리스트)에서 지정한 요소들이 모두 포함된 행만 골라내야 하는 경우가 있습니다. 이럴 때 파이썬에서는 리스트 컴프리헨션(list comprehension)과 내장 함수 all()을 조합하면 아주 간결하게 처리할 수 있습니다.

예제 코드

my_list = [[261, 49, 61], [27, 49, 3, 261], [261, 49, 85], [1, 1, 9]]

print("The list is :")
print(my_list)

check_list = [49, 61, 261, 85]

my_result = [index for index in my_list if all(element in check_list for element in index)]

print("The result is :")
print(my_result)

실행 결과

The list is :
[[261, 49, 61], [27, 49, 3, 261], [261, 49, 85], [1, 1, 9]]
The result is :
[[261, 49, 61], [261, 49, 85]]

코드 설명

  • 먼저 중첩 리스트를 정의하고 콘솔에 출력합니다.

  • 필터링 기준이 될 요소들로 구성된 별도의 정수 리스트(check_list)를 정의합니다.

  • 리스트 컴프리헨션으로 my_list의 각 행을 순회하면서, all() 함수를 사용해 해당 행의 모든 요소가 check_list에 속하는지 검사합니다.

  • 조건을 만족하는 행만 결과 리스트에 담기고, 그 결과가 변수 my_result에 할당됩니다.

  • 마지막으로 필터링된 최종 결과가 콘솔에 출력됩니다.

동작 원리 살펴보기

all() 함수는 인자로 받은 반복 가능 객체(iterable)의 모든 요소가 참(True)일 때 True를 반환합니다. 위 예제에서는 제너레이터 표현식 (element in check_list for element in index)이 각 행의 요소 하나하나가 check_list에 포함되어 있는지 검사하고, all()이 그 결과를 종합해 판단합니다.

예를 들어 두 번째 행 [27, 49, 3, 261]은 27과 3이 check_list에 없으므로 all()이 False를 반환해 제외됩니다. 반면 첫 번째 행 [261, 49, 61]은 모든 요소가 포함되어 있어 결과에 그대로 유지됩니다.

참고: set을 활용한 대안

데이터 크기가 크거나 요소 개수가 많다면 집합(set) 연산을 활용하면 더 효율적으로 처리할 수 있습니다.

check_set = set(check_list)
my_result = [row for row in my_list if set(row) <= check_set]

여기서 <=는 부분집합(subset) 연산자로, 각 행 전체가 check_set의 부분집합인지 확인합니다. 집합 탐색은 평균적으로 O(1)이므로 리스트보다 빠른 성능을 기대할 수 있습니다.