행렬(리스트의 리스트) 안에서 모든 요소의 데이터 유형이 서로 겹치지 않는 행만 골라내야 하는 경우가 있습니다. 이럴 때는 행렬을 순회하면서 각 요소의 유형을 확인하고, set 자료형의 중복 제거 특성을 활용하면 간단하게 해결할 수 있습니다.
핵심 아이디어
한 행(부분 리스트) 안에 있는 요소들의 유형을 모두 모은 뒤 set으로 변환하면 중복된 유형이 사라집니다. 만약 원래 행의 길이와 고유한 유형의 개수가 같다면, 그 행의 모든 요소는 서로 다른 데이터 유형을 가진다는 의미입니다.
예제 코드
아래는 실제 동작을 보여주는 전체 코드입니다.
my_list = [[4, 2, 6], ["python", 2, {6: 2}], [3, 1, "fun"], [9, (4, 3)]]
print("The list is :")
print(my_list)
my_result = []
for sub in my_list:
type_size = len(list(set([type(ele) for ele in sub])))
if len(sub) == type_size:
my_result.append(sub)
print("The resultant distinct data type rows are :")
print(my_result)실행 결과
The list is :
[[4, 2, 6], ['python', 2, {6: 2}], [3, 1, 'fun'], [9, (4, 3)]]
The resultant distinct data type rows are :
[['python', 2, {6: 2}], [9, (4, 3)]]코드 설명
정수, 문자열, 딕셔너리, 튜플 등 다양한 데이터 유형이 섞여 있는 리스트를 정의하고 콘솔에 출력합니다.
조건을 만족하는 행을 담아둘 빈 리스트
my_result를 준비합니다.원본 리스트를 순회하면서 각 행(부분 리스트)에 대해, 리스트 컴프리헨션으로 모든 요소의
type()값을 수집합니다.수집된 유형 목록을
set으로 변환해 중복을 제거한 후, 다시list로 변환하고 그 길이를 구합니다. 이 값이 곧 해당 행에 존재하는 고유한 데이터 유형의 개수입니다.행의 전체 길이와 고유 유형의 개수를 비교합니다.
두 값이 일치하면 그 행의 모든 요소가 서로 다른 유형이라는 뜻이므로, 결과 리스트에 추가(
append)합니다.반복이 끝나면 최종 결과를 콘솔에 출력합니다.
결과 분석
실행 결과를 보면 첫 번째 행 [4, 2, 6]은 세 요소가 모두 정수(int)라서 제외되었고, 세 번째 행 [3, 1, "fun"] 역시 정수가 두 개 있어 제외되었습니다. 반면 ['python', 2, {6: 2}]는 문자열·정수·딕셔너리, [9, (4, 3)]는 정수·튜플로 각각 유형이 모두 달라 최종 결과에 포함되었습니다.