중첩 리스트(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)이므로 리스트보다 빠른 성능을 기대할 수 있습니다.