숫자와 문자열이 섞여 있는 중첩 리스트(혼합 행렬)에서 문자열 요소만 골라내야 하는 경우, 리스트 컴프리헨션(list comprehension)과 isinstance() 메서드를 함께 사용하면 간단하게 해결할 수 있습니다.
예제 코드
아래는 혼합 리스트에서 문자열 요소를 추출하는 전체 예제입니다.
my_list = [[35, 66, 31], ["python", 13, "is"], [15, "fun", 14]]
print("원본 리스트 :")
print(my_list)
my_result = [element for index in my_list for element in index if isinstance(element, str)]
print("추출 결과 :")
print(my_result)실행 결과
원본 리스트 : [[35, 66, 31], ['python', 13, 'is'], [15, 'fun', 14]] 추출 결과 : ['python', 'is', 'fun']
코드 설명
정수와 문자열이 섞인 리스트의 리스트(중첩 리스트)를 정의하고 콘솔에 출력합니다.
리스트 컴프리헨션을 사용해 중첩 리스트의 모든 요소를 순회합니다. 바깥쪽 for 문이 각 하위 리스트를, 안쪽 for 문이 하위 리스트 내 개별 요소를 반복 처리합니다.
isinstance(element, str)메서드로 각 요소가 문자열(str) 타입인지 검사합니다. 이 방식은 타입을 확인하는 가장 파이썬다운 방법으로 알려져 있습니다.조건을 만족하는 문자열 요소들만 모아 새로운 리스트를 생성하고 변수에 할당합니다.
최종 결과 리스트를 콘솔에 출력합니다.
참고: filter()를 활용한 대안
같은 작업은 filter() 함수와 itertools.chain을 조합해서도 구현할 수 있습니다.
from itertools import chain my_list = [[35, 66, 31], ["python", 13, "is"], [15, "fun", 14]] result = list(filter(lambda x: isinstance(x, str), chain.from_iterable(my_list))) print(result) # ['python', 'is', 'fun']
다만 리스트 컴프리헨션이 가독성과 성능 면에서 더 유리하기 때문에, 일반적으로는 첫 번째 방법이 권장됩니다.