파이썬 리스트는 문자열과 숫자를 하나의 리스트에 함께 담을 수 있습니다. 이처럼 서로 다른 자료형이 섞여 있는 리스트를 이기종(heterogeneous) 리스트라고 부릅니다. 이 글에서는 이러한 리스트에서 숫자 요소만 대상으로 최솟값과 최댓값을 구하는 방법을 예제와 함께 살펴보겠습니다.
1. 최솟값 찾기
가장 기본적인 접근 방식은 isinstance() 함수를 사용해 리스트에서 정수(int) 타입인 요소만 걸러낸 뒤, min() 함수를 적용하는 것입니다. 제너레이터 표현식을 활용하면 한 줄로 간결하게 처리할 수 있습니다.
예제 코드
listA = [12, 'Sun', 39, 5, 'Wed', 'Thus']
# 주어진 리스트
print("주어진 리스트 : ", listA)
# 정수만 필터링한 후 최솟값 계산
res = min(i for i in listA if isinstance(i, int))
# 결과 출력
print("리스트의 최솟값 : ", res)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
주어진 리스트 : [12, 'Sun', 39, 5, 'Wed', 'Thus'] 리스트의 최솟값 : 5
문자열 'Sun', 'Wed', 'Thus'는 isinstance(i, int) 조건에서 제외되고, 숫자 12, 39, 5 중 가장 작은 값인 5가 반환됩니다.
2. 최댓값 찾기
최댓값도 비슷한 방식으로 구할 수 있지만, 이번에는 max() 함수에 lambda 함수를 key 인자로 전달하는 방법을 사용해 보겠습니다. 여기서 람다 함수는 각 요소를 (정수 여부, 값) 형태의 튜플로 변환합니다. 파이썬은 튜플을 앞 요소부터 순서대로 비교하므로, 문자열(False)보다 정수(True)가 항상 우선순위를 갖게 되어 숫자 중에서만 최댓값이 선택됩니다.
예제 코드
listA = [12, 'Sun', 39, 5, 'Wed', 'Thus']
# 주어진 리스트
print("주어진 리스트 : ", listA)
# max 함수에 lambda 키 적용
res = max(listA, key=lambda i: (isinstance(i, int), i))
# 결과 출력
print("리스트의 최댓값 : ", res)실행 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
주어진 리스트 : [12, 'Sun', 39, 5, 'Wed', 'Thus'] 리스트의 최댓값 : 39
정수 요소들 중 가장 큰 값인 39가 올바르게 반환된 것을 확인할 수 있습니다.
마무리
이기종 리스트에서 숫자만 골라 최솟값·최댓값을 구할 때는 isinstance()로 자료형을 확인하는 것이 핵심입니다. 최솟값은 제너레이터 표현식과 min(), 최댓값은 lambda 키와 max()를 조합하면 문자열과 섞여 있어도 안전하게 원하는 값을 얻을 수 있습니다.