행렬의 각 열에 있는 모든 요소가 고유한지(중복이 없는지) 검사해야 하는 경우, 간단한 반복문과 리스트 컴프리헨션(list comprehension), 그리고 'set' 연산자를 활용하면 손쉽게 해결할 수 있습니다.
핵심 아이디어는 집합(set)은 중복을 허용하지 않는다는 특성을 이용하는 것입니다. 즉, 한 열을 집합으로 변환했을 때 길이가 줄어든다면 중복된 요소가 존재한다는 뜻입니다.
아래는 실제 동작 예시입니다.
예제 코드
my_list = [[11, 24, 84], [24, 55, 11], [7, 11, 9]]
print("The list is :")
print(my_list)
my_result = True
for index in range(len(my_list[0])):
column = [ele[index] for ele in my_list]
if len(list(set(column))) != len(column):
my_result = False
break
if(my_result == True):
print("All columns are unique")
else:
print(("All columns are not unique"))실행 결과
The list is : [[11, 24, 84], [24, 55, 11], [7, 11, 9]] All columns are unique
코드 설명
정수로 구성된 리스트의 리스트(2차원 리스트)를 정의한 후, 콘솔에 출력하여 보여줍니다.
결과를 저장할 변수를 선언하고 불리언 값
True로 초기화합니다.첫 번째 행의 길이만큼 반복하며, 리스트 컴프리헨션을 사용해 각 인덱스 위치의 요소들을 모아 해당 열(column)을 추출합니다.
추출한 열을
set()으로 변환하여 고유한 요소만 남긴 뒤, 그 길이와 원래 열의 길이를 비교합니다. 두 길이가 다르다는 것은 중복된 요소가 있다는 의미이므로, 불리언 값을False로 변경합니다.중복이 발견되는 즉시
break> 문으로 반복문을 빠져나와 불필요한 연산을 줄입니다.마지막으로 최종 불리언 값에 따라 모든 열이 고유한지 여부에 대한 메시지를 콘솔에 출력합니다.
참고: 더 간결한 작성 방법
all() 함수와 제너레이터 표현식을 활용하면 위 코드를 다음과 같이 한 줄로 더 간결하게 표현할 수도 있습니다.
my_result = all(
len(set(col)) == len(col)
for col in zip(*my_list)
)여기서 zip(*my_list)는 2차원 리스트의 행과 열을 뒤바꿔(transpose) 각 열을 튜플 형태로 순회할 수 있게 해주는 파이썬의 관용적인 기법입니다. 이 방법을 사용하면 인덱스 계산 없이도 동일한 결과를 얻을 수 있으며, 코드의 가독성도 크게 향상됩니다.