파이썬에서 2차원 리스트를 다룰 때, 특정 'K'번째 열의 값이 서로 같은(중복되는) 행을 제거해야 하는 경우가 있습니다. 이럴 때는 간단한 반복문과 append 메서드를 활용하면 손쉽게 해결할 수 있습니다.
예제
아래는 실제 동작을 보여주는 데모입니다 −
my_list = [[45, 95, 26], [70, 35, 74], [87, 65, 23], [70, 35, 74], [67, 85, 12], [45, 65, 0]]
print("리스트 : ")
print(my_list)
K = 1
print("K의 값 : ")
print(K)
my_result = []
my_mem = []
for index in my_list:
if not index[K] in my_mem:
my_result.append(index)
my_mem.append(index[K])
print("결과 리스트 : ")
print(my_result)
출력
리스트 : [[45, 95, 26], [70, 35, 74], [87, 65, 23], [70, 35, 74], [67, 85, 12], [45, 65, 0]] K의 값 : 1 결과 리스트 : [[45, 95, 26], [70, 35, 74], [87, 65, 23], [67, 85, 12]]
코드 설명
리스트 안에 리스트가 포함된 형태(2차원 리스트)가 정의되고, 콘솔에 출력됩니다.
중복 판단 기준이 될 열의 위치인 K 값이 초기화되고 콘솔에 출력됩니다.
결과를 담을 리스트와 이미 확인한 값을 담을 리스트, 두 개의 빈 리스트가 정의됩니다.
원본 리스트를 순회하면서, 현재 행의 K번째 요소가 아직 확인된 적이 없다면 해당 행을 결과 리스트에 추가하고, 그 요소 값을 확인용 리스트에 함께 저장합니다.
마지막으로 중복이 제거된 결과 리스트가 콘솔에 출력됩니다.
더 효율적인 방법: set 활용하기
위 방법은 in 연산자로 리스트 내부를 탐색하기 때문에 데이터가 많아질수록 성능이 저하될 수 있습니다(O(n²)). 대신 set을 사용하면 조회 속도가 O(1)로 크게 향상됩니다.
my_list = [[45, 95, 26], [70, 35, 74], [87, 65, 23], [70, 35, 74], [67, 85, 12], [45, 65, 0]]
K = 1
seen = set()
my_result = []
for row in my_list:
if row[K] not in seen:
seen.add(row[K])
my_result.append(row)
print("결과 리스트 : ", my_result)
출력
결과 리스트 : [[45, 95, 26], [70, 35, 74], [87, 65, 23], [67, 85, 12]]
두 방법 모두 각 행의 원래 순서를 유지하면서, K번째 열 값이 처음 등장한 행만 남기고 나머지 중복 행은 제거합니다. 처리할 데이터의 크기가 크다면 set 기반 방식을 사용하는 것이 좋습니다.