리스트의 리스트(2차원 배열)에서 중복 요소가 나타나는 열을 제거해야 하는 경우가 있습니다. 이럴 때는 빈 집합(set)을 생성하는 메서드를 정의하고, 리스트를 순회하면서 아직 집합에 없는 요소는 추가하고, 이미 존재하는 요소라면 해당 인덱스를 반환하는 방식으로 해결할 수 있습니다.
예제 코드
아래 예제를 통해 실제 동작을 확인해 보겠습니다.
from itertools import chain
def remove_dupes(my_sub):
my_string = set()
for i, elem in enumerate(my_sub):
if elem not in my_string:
my_string.add(elem)
else:
yield i
my_list = [[5, 1, 6, 7, 9], [6, 3, 1, 9, 1], [4, 2, 9, 8, 9], [5, 1, 6, 7, 3]]
print("The list is : ")
print(my_list)
K = 3
temp_idxs = set(chain.from_iterable(remove_dupes(sub) for sub in my_list))
my_result = [[elem for i, elem in enumerate(sub) if i not in temp_idxs] for sub in my_list]
print("The result is : ")
print(my_result)실행 결과
The list is : [[5, 1, 6, 7, 9], [6, 3, 1, 9, 1], [4, 2, 9, 8, 9], [5, 1, 6, 7, 3]] The result is : [[5, 1, 6, 7], [6, 3, 1, 9], [4, 2, 9, 8], [5, 1, 6, 7]]
코드 설명
필요한 패키지(
itertools)를 환경에 임포트합니다.리스트를 매개변수로 받는
remove_dupes라는 이름의 제너레이터 함수를 정의합니다.함수 내부에서 빈 집합을 생성하여 중복 여부를 추적합니다.
enumerate로 리스트의 요소와 인덱스를 함께 순회하며, 요소가 집합에 없으면 집합에 추가합니다.이미 집합에 존재하는 요소라면, 즉 중복이라면 해당 인덱스를
yield로 반환합니다.함수 외부에서 리스트의 리스트를 정의하고 콘솔에 출력합니다.
변수
K에 값을 할당합니다.chain.from_iterable과 함께 제너레이터 함수를 각 하위 리스트에 대해 호출하면서 결과를 하나의 집합으로 변환하여 변수에 저장합니다. 이 집합에는 모든 행에서 중복으로 발견된 열의 인덱스가 담깁니다.다시 리스트를 순회하면서, 앞서 구한 인덱스 집합에 포함되지 않은 위치의 요소만 남기고 새로운 리스트를 구성합니다.
최종 결과 변수를 콘솔에 출력합니다.
실행 결과를 보면 각 행에서 네 번째 요소(인덱스 4)가 다른 행들과 중복되어 제거되었음을 확인할 수 있습니다. 이처럼 제너레이터와 집합을 활용하면 대용량 데이터에서도 효율적으로 중복 열을 처리할 수 있습니다.