Python에서 목록(배열)에 중복 요소가 있는지 확인

사업

다음은 다음 각 경우에 대해 Python에서 목록(배열)에 중복 요소(모든 요소가 고유/고유)가 있는지 확인하는 방법에 대한 설명입니다.

  • 요소에 목록이 없는 목록의 경우
  • 요소 목록이 있는 목록의 경우(2차원 배열, 목록 목록 등)

목록에서 중복 요소를 제거하거나 추출하는 방법에 대한 다음 문서를 참조하세요.

목록은 다양한 유형의 데이터를 저장할 수 있으며 배열과 완전히 다릅니다. 메모리 크기와 메모리 주소가 필요한 프로세스에서 배열을 처리하거나 대용량 데이터의 수치 처리를 수행하려면 배열(표준 라이브러리) 또는 NumPy를 사용하십시오.

목록에 중복 요소가 있는지 확인(요소에 목록이 없는 경우)

요소에 목록과 같은 업데이트 가능한 개체가 없으면 집합 집합 유형의 생성자 set()를 사용합니다.

집합 유형은 중복 요소가 없는 데이터 유형입니다. 목록이 생성자 set()에 전달되면 중복 값은 무시되고 고유한 값만 요소로 설정된 유형의 개체가 반환됩니다.

이 집합 유형 객체의 요소 수와 원본 목록을 가져와서 내장 함수 len()을 사용하여 비교합니다.

  • 요소 수가 같으면 원래 목록에 중복 요소가 없습니다.
  • 요소 수가 다른 경우 중복 요소가 원본 목록에 포함됩니다.

중복 요소가 없으면 false를 반환하고 중복 요소가 있으면 true를 반환하는 함수는 다음과 같습니다.

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

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

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

예제는 목록이지만 튜플에서도 동일한 기능을 사용할 수 있습니다.

목록과 같은 변경 가능한(업데이트 가능한) 개체는 유형 집합의 요소가 될 수 없습니다. 따라서 목록이 요소로 포함된 목록(2차원 배열, 목록 목록 등)은 TypeError가 발생합니다. 대책은 아래와 같습니다.

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

목록에 중복 요소가 있는지 확인(요소에 목록이 있는 경우)

요소 목록이 있는 목록(예: 목록 목록)의 경우 다음 함수를 사용하여 중복 요소가 있는지 확인할 수 있습니다.

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)

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

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

set() 대신 목록 이해 표기법은 요소가 고유한 값일 뿐인 목록을 생성하고 요소 수를 비교합니다. 자세한 내용은 다음 문서를 참조하세요.

이 기능은 요소 목록이 없는 목록에도 유효합니다.

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

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

지금까지의 예는 요소 목록이 중복되었는지 여부(동일한 목록 포함)를 판별하는 것입니다.

각 목록의 요소가 겹치는지 여부는 원래 목록을 하나의 차원으로 병합한 후 결정할 수 있습니다.

l_2d = [[0, 1], [2, 3]]
print(sum(l_2d, []))
# [0, 1, 2, 3]

print(has_duplicates(sum(l_2d, [])))
# False

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

여기서 sum()은 목록을 평면화하는 데 사용되지만 itertools.chain.from_iterable()도 사용할 수 있습니다. 또한 3차원 이상의 목록을 병합할 때 새로운 기능을 정의해야 합니다.