Python 리스트 배열 중복 값 요소 판정 방법

리스트 내에 중복하는 요소가 있는지 판정하고 싶은 경우가 있습니다.

1차원 리스트 형태와 2차원 형태인 다차원 리스트로 나눠서 중복하는 값이 있는지 판정하는 예제를 보겠습니다.

 

1차원 리스트

1차원 형태의 리스트의 경우에는 집합 set형태인 set()을 사용할 수 있습니다. 

set타입은 중복하는 요소를 가질 수 없는 데이터 타입으로, set()에 리스트를 넣게 되면 중복하는 값은 제거됩니다.

이러한 특성을 가진 set 타입 오브젝트를 활용해서 리스트 안에 중복된 값이 있는지 확인하는 처리를 할 수 있습니다.

def has_duplicates(seq):
    return len(seq) != len(set(seq))

ls = [0, 1, 2]
print(has_duplicates(ls))
# False

ls = [0, 1, 1, 2]
print(has_duplicates(ls))
# True

 

중복하는 값이 없는 경우에는 False, 중복하는 값이 있는 경우에는 True를 반환하는 함수를 만들어 판정하는 샘플입니다.

위 예제는 1차원 리스트만 사용 가능합니다.

2차원 리스트를 위 예제로 판정하게 되면 TypeError가 발생합니다.

def has_duplicates(seq):
    return len(seq) != len(set(seq))

ls = [[0, 1], [1, 1], [0, 1], [1, 0]]
print(has_duplicates(ls))
# TypeError: unhashable type: 'list'

  

2차원 리스트

이번에는 리스트 안에 리스트가 들어있는 형태인 다차원 리스트에 중복하는 값이 있는지 판정하는 샘플을 보겠습니다.

def has_duplicates2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) != len(unique_list)

ls = [[0, 0], [0, 1], [1, 1], [1, 0]]
print(has_duplicates2(ls))
# False

ls= [[0, 0], [0, 1], [1, 1], [1, 1]]
print(has_duplicates2(ls))
# True

 

이번에도 함수 형태로 만들어 사용해봤습니다.

중복된 값이 없으면 False, 중복된 값이 있으면 True를 반환합니다.

다차원 리스트 중복 확인 예제에서 사용한 함수에 1차원 리스트 형태로 호출해보겠습니다.

def has_duplicates2(seq):
    seen = []
    unique_list = [x for x in seq if x not in seen and not seen.append(x)]
    return len(seq) != len(unique_list)

ls = [0, 1, 2]
print(has_duplicates2(ls))
# False

ls = [0, 1, 1, 2]
print(has_duplicates2(ls))
# True

 

TypeError도 발생하지 않고 중복 체크 처리를 해줍니다.

2차원 리스트까지는 중복체크를 할 수 있지만 3차원 이상의 리스트는 제대로 동작을 안 할 수 있습니다.

댓글