2021-01-04 11:44:27

파이썬 리스트 내 중복된 요소가 있는 경우, 중복된 요소는 제거하고 싶다면 어떻게 해야 할까요? 예를 들어, A = [1, 2, 1, 3, 2, 4, 4, 5, 1] 과 같은 리스트가 있다면, result_A = [1, 2, 3, 4, 5]를 찾고 싶은 상황입니다. 

 

다양한 방법이 있겠지만, 제가 짠 로직은 다음과 같습니다. (아마 저 말고도 대부분 이렇게 짤 것 같습니다.)

 

1) result_A 라는 이름의 빈 리스트를 하나 만든다.

2) for 문으로 A 리스트 안에 요소를 하나씩 빼와서 그 요소가 result_A 안에 있지 않으면 result_A에 추가한다.

 

파이썬 코드로 구현하면 다음과 같습니다.

 

A = [1, 2, 1, 3, 2, 4, 4, 5, 1]

result_A = []

for i in A:
    if i not in result_A:
        result_A.append(i)

print(result_A)

 

위 코드를 실행하면 다음과 같이 중복된 요소들은 제거한 리스트가 생성됩니다. 

 

 

다른 방법1. numpy의 unique() 함수 활용

물론 다른 간단한 방법도 있습니다. numpy 패키지의 unique() 함수를 활용하는 것도 하나의 방법이 될 수 있습니다. 파이썬 리스트를 numpy.unique() 함수의 매개변수로 넣어주면 반환값은 넘파이 배열이기 때문에 만약 파이썬 리스트로 변환하고 싶다면 그 반환값을 list() 함수에 넣어주면 됩니다. 

 

import numpy as np

A = [1, 2, 1, 3, 2, 4, 4, 5, 1]

result_A = list(np.unique(A))

print(result_A)

 

 

다른 방법2. set 활용

제 영혼의 친구 꼬장스카이비전님께서 아래 댓글에서 제안해주신 방법처럼 리스트의 데이터 타입을 set으로 변경합니다. 그러면 중복된 요소들이 제거되고 하나씩만 남게 됩니다. 그것을 다시 list() 함수에 넣어주면 됩니다.  

 

A = [1, 2, 1, 3, 2, 4, 4, 5, 1]

print(set(A))

result_A = list(set(A))

print(result_A)

 

 

그런데 여기서 주의해야 할 점은 set 함수를 사용하는 경우에는 자동으로 오름차순으로 정렬된다는 점입니다.

 

A = [5, 2, 4, 3, 2, 4, 4, 5, 1]

print(set(A))

result_A = list(set(A))

print(result_A)

 

 

이렇게 졍렬되는 것을 원치 않는 경우에는 이 방법을 사용하시면 안 됩니다.  

 

관련 글

- [python] 리스트의 중복된 요소들 중에 고유한 요소들을 알고 싶다면, numpy.unique()

 

 

(이 글은 2022-10-03에 마지막으로 수정되었습니다)