Python에서는 리스트 안에 또 다른 리스트가 포함된 중첩 리스트(nested list) 구조를 자주 다루게 됩니다. 이 글에서는 상위 리스트의 요소로 존재하는 하위 리스트(sublist)들 사이에서, 특정 요소가 있는지 효율적으로 확인하는 세 가지 방법을 소개합니다.
1. any() 함수 활용하기
가장 직관적인 방법은 any() 함수를 사용하는 것입니다. 각 하위 리스트에 검색하려는 요소가 존재하는지 확인하고, 하나라도 참이면 해당 요소가 전체 리스트에 존재한다고 판단할 수 있습니다.
예제 코드
listA = [[-9, -1, 3], [11, -8], [-4, 434, 0]]
search_element = -8
# 주어진 리스트 출력
print("주어진 리스트 :\n", listA)
print("검색할 요소: ", search_element)
# any()와 in 조합으로 확인
if any(search_element in sublist for sublist in listA):
print("존재함")
else:
print("존재하지 않음")실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
주어진 리스트 : [[-9, -1, 3], [11, -8], [-4, 434, 0]] 검색할 요소: -8 존재함
2. in 연산자와 제너레이터 표현식 활용하기
두 번째 방법은 in 연산자와 제너레이터 표현식을 결합하는 것입니다. 모든 하위 리스트의 요소를 하나씩 펼쳐서(flat) 검색 대상과 비교합니다. 요소가 존재하는 경우와 존재하지 않는 경우 두 가지를 모두 확인해 보겠습니다.
예제 코드
listA = [[-9, -1, 3], [11, -8], [-4, 434, 0]]
search_element = -8
print("주어진 리스트 :\n", listA)
print("검색할 요소: ", search_element)
# in 연산자 사용
if search_element in (item for sublist in listA for item in sublist):
print("존재함")
else:
print("존재하지 않음")
search_element = 13
print("새로운 검색 요소: ", search_element)
if search_element in (item for sublist in listA for item in sublist):
print("존재함")
else:
print("존재하지 않음")실행 결과
주어진 리스트 : [[-9, -1, 3], [11, -8], [-4, 434, 0]] 검색할 요소: -8 존재함 새로운 검색 요소: 13 존재하지 않음
3. itertools.chain() 활용하기
세 번째 방법은 itertools 모듈의 chain() 함수를 사용하는 것입니다. chain(*listA)는 여러 개의 하위 리스트를 하나의 연속된 시퀀스로 펼쳐주기 때문에, 이후에는 일반적인 in 연산자로 손쉽게 요소 존재 여부를 검사할 수 있습니다.
예제 코드
from itertools import chain
listA = [[-9, -1, 3], [11, -8], [-4, 434, 0]]
search_element = -8
print("주어진 리스트 :\n", listA)
print("검색할 요소: ", search_element)
# chain()과 in 조합으로 확인
if search_element in chain(*listA):
print("존재함")
else:
print("존재하지 않음")
search_element = 13
print("새로운 검색 요소: ", search_element)
if search_element in chain(*listA):
print("존재함")
else:
print("존재하지 않음")실행 결과
주어진 리스트 : [[-9, -1, 3], [11, -8], [-4, 434, 0]] 검색할 요소: -8 존재함 새로운 검색 요소: 13 존재하지 않음
정리
세 가지 방법 모두 동일한 결과를 제공하지만, 상황에 따라 적합성이 다릅니다. 간단한 조건 검사에는 any()가 가독성이 좋고, 추가 변환이 필요 없는 순수 검사에는 제너레이터 표현식이 유용하며, 이미 itertools를 사용 중이거나 여러 iterable을 처리해야 하는 경우에는 chain()이 깔끔한 선택입니다. 코드의 의도와 맥락에 맞는 방법을 선택하면 됩니다.