문자열로 이루어진 리스트가 주어졌을 때, 그중 첫 번째로 비어 있지 않은 요소를 찾아야 하는 경우가 자주 있습니다. 여기서 문제가 되는 부분은 리스트 맨 앞에 빈 문자열이 하나, 둘, 혹은 그 이상 존재할 수 있다는 점입니다. 따라서 빈 문자열의 개수와 상관없이 동적으로 첫 번째 유효한 문자열을 찾아내야 합니다.
방법 1: next() 함수 활용
next() 함수를 사용하면 현재 요소가 빈 값일 때 자동으로 다음 요소로 이동하면서 조건을 만족하는 첫 번째 값을 찾을 수 있습니다. 제너레이터 표현식과 함께 사용하면 매우 간결하고 파이썬다운 코드가 완성됩니다.
예제 코드
listA = ['', 'top', 'pot', 'hot', ' ', 'shot']
# 주어진 리스트 출력
print("Given list:\n ", listA)
# next() 사용
res = next(sub for sub in listA if sub)
# 결과 출력
print("The first non empty string is : \n", res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given list: ['', 'top', 'pot', 'hot', ' ', 'shot'] The first non empty string is : top
여기서 if sub 조건은 빈 문자열('')을 거짓(falsy)으로 판단하여 건너뛰고, 공백 한 칸(' ')은 참(truthy)으로 평가된다는 점에 유의하세요. 만약 공백만 있는 문자열도 제외하고 싶다면 if sub.strip()과 같이 strip() 메서드를 함께 사용하면 됩니다.
방법 2: filter() 함수 활용
filter() 함수를 이용하는 방법도 있습니다. filter에 None을 첫 번째 인수로 전달하면 빈 값들이 모두 제거되므로, 필터링된 결과에서 첫 번째 값을 가져오면 됩니다. 단, 이 방식은 Python 2에서만 동작합니다. Python 3에서는 filter가 제너레이터 객체를 반환하기 때문에 인덱싱을 하려면 반드시 list()로 감싸주어야 합니다.
예제 코드
listA = ['', 'top', 'pot', 'hot', ' ', 'shot']
# 주어진 리스트 출력
print("Given list:\n ", listA)
# filter() 사용
res = filter(None, listA)[0]
# 결과 출력
print("The first non empty string is : \n", res)실행 결과
위 코드를 실행하면 다음과 같은 결과를 얻을 수 있습니다.
Given list: ['', 'top', 'pot', 'hot', ' ', 'shot'] The first non empty string is : top
Python 3 환경이라면 다음과 같이 작성해야 합니다.
res = list(filter(None, listA))[0]
정리
두 방법 모두 빈 문자열을 효과적으로 건너뛰고 첫 번째 유효한 문자열을 반환합니다. 일반적으로는 next()와 제너레이터 표현식을 조합한 방법이 권장됩니다. 불필요한 중간 리스트를 생성하지 않아 메모리 효율이 좋고, 조건을 유연하게 변경할 수 있으며, 최신 Python 버전에서도 문제없이 동작하기 때문입니다.