매트릭스(리스트의 리스트)에서 딕셔너리 키로 사용할 수 있는 불변(immutable) 타입의 요소들로만 구성된 행을 필터링해야 하는 경우가 있습니다. Python에서는 리스트 컴프리헨션(list comprehension)과 isinstance 메서드를 조합하면 이러한 작업을 간결하게 처리할 수 있습니다.
딕셔너리의 키는 반드시 해시 가능(hashable)한 값이어야 하기 때문에, 정수(int), 실수(float), 문자열(str), 불리언(bool), 튜플(tuple)과 같은 불변 타입만 허용됩니다. 반면 리스트(list)나 딕셔너리(dict)처럼 변경 가능한(mutable) 타입은 키로 사용할 수 없습니다. 아래 예제는 이 원리를 활용해 조건에 맞는 행만 걸러내는 방법을 보여줍니다.
예제
my_list = [[24, 15, [32, 33, 12]], ["pyt", 8, (14, 54)], [{15:24}, 13, "fun"], [True, "cool"]]
print("The list is :")
print(my_list)
my_result = [row for row in my_list if all(isinstance(element, int) or isinstance(element, bool) or isinstance(element, float) or isinstance(element, tuple) or isinstance(element, str) for element in row)]
print("The result is :")
print(my_result)출력
The list is :
[[24, 15, [32, 33, 12]], ['pyt', 8, (14, 54)], [{15: 24}, 13, 'fun'], [True, 'cool']]
The result is :
[['pyt', 8, (14, 54)], [True, 'cool']]설명
리스트 안에 여러 타입의 요소를 포함하는 중첩 리스트를 정의하고, 콘솔에 출력합니다.
리스트 컴프리헨션을 사용해 각 행(row)을 순회하면서, 내장 함수
all()과isinstance메서드를 통해 해당 행의 모든 요소가 int, bool, float, tuple, str 중 하나인지 검사합니다.모든 요소가 조건을 만족하는(즉, 불변이며 해시 가능한) 행만 결과 리스트에 저장되고, 변수
my_result에 할당됩니다.첫 번째 행은 내부에 리스트가 포함되어 있고, 세 번째 행은 딕셔너리가 포함되어 있어 제외되며, 최종 결과에는 두 번째와 네 번째 행만 남게 됩니다.
필터링된 결과가 콘솔에 출력됩니다.
참고: 더 간결한 대안
위 코드에서는 여러 개의 isinstance 호출이 반복되는데, 두 번째 인자에 타입들을 튜플로 묶어 전달하면 코드를 훨씬 간결하게 만들 수 있습니다.
immutable_types = (int, bool, float, tuple, str) my_result = [row for row in my_list if all(isinstance(element, immutable_types) for element in row)]
또한 Python 3.10 이상에서는 isinstance(element, int | float | str | bool | tuple)처럼 유니온 연산자(|)를 사용할 수도 있습니다. 상황에 맞는 방식을 선택하면 가독성과 유지보수성을 모두 높일 수 있습니다.