리스트에 저장된 여러 튜플 중에서 모든 요소가 None으로만 이루어진 튜플을 제거해야 하는 경우가 있습니다. 이럴 때는 파이썬의 리스트 컴프리헨션(list comprehension)과 내장 함수 all()을 조합하면 아주 간단하게 처리할 수 있습니다.
아래 예제를 통해 자세히 살펴보겠습니다.
예제 코드
my_list = [(2, None, 12), (None, None, None), (23, 64), (121, 13), (None, ), (None, 45, 6)]
print("The list is : ")
print(my_list)
my_result = [sub for sub in my_list if not all(elem == None for elem in sub)]
print("The None tuples have been removed, the result is : " )
print(my_result)
실행 결과
The list is : [(2, None, 12), (None, None, None), (23, 64), (121, 13), (None,), (None, 45, 6)] The None tuples have been removed, the result is : [(2, None, 12), (23, 64), (121, 13), (None, 45, 6)]
코드 설명
여러 개의 튜플을 담고 있는 리스트를 정의한 뒤 콘솔에 출력합니다.
리스트 컴프리헨션을 사용하여 리스트의 각 튜플을 하나씩 순회합니다.
all()함수를 통해 각 튜플의 모든 요소가 None인지 검사합니다. 모든 요소가 None이라면all()은 True를 반환합니다.not연산자로 조건을 반전시키기 때문에, 모든 요소가 None인 튜플은 결과 리스트에서 제외됩니다.필터링을 통과한 나머지 데이터는 새로운 변수에 할당됩니다.
이 변수를 출력하면 None으로만 구성된 튜플이 제거된 최종 결과를 확인할 수 있습니다.
대안: any() 함수 활용하기
all() 대신 any()를 사용하면 조건을 더 직관적으로 표현할 수 있습니다. 즉, 'None이 아닌 요소가 하나라도 존재하면 해당 튜플을 유지'하는 방식입니다.
my_result = [sub for sub in my_list if any(elem is not None for elem in sub)]
또한 elem == None보다는 elem is None 형태로 비교하는 것이 파이썬 공식 스타일 가이드(PEP 8)에서 권장하는 방식이므로, 실무 코드에서는 이를 적용하는 것이 좋습니다.