Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python – 중복 요소가 포함된 열 제거 방법

리스트의 리스트(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)가 다른 행들과 중복되어 제거되었음을 확인할 수 있습니다. 이처럼 제너레이터와 집합을 활용하면 대용량 데이터에서도 효율적으로 중복 열을 처리할 수 있습니다.