[python] 목록의 모든 요소가 고유한지 확인

목록의 모든 요소가 고유한지 확인하는 가장 좋은 방법은 무엇입니까 (기존 방식과 같이 가장 좋은 방법)?

a를 사용하는 현재 접근 방식 Counter은 다음과 같습니다.

>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
        if values > 1:
            # do something

더 잘할 수 있습니까?



답변

가장 효율적이지는 않지만 간단하고 간결합니다.

if len(x) > len(set(x)):
   pass # do something

아마도 짧은 목록의 경우 큰 차이를 만들지 않을 것입니다.


답변

다음은 조기 종료를 수행 할 2 줄입니다.

>>> def allUnique(x):
...     seen = set()
...     return not any(i in seen or seen.add(i) for i in x)
...
>>> allUnique("ABCDEF")
True
>>> allUnique("ABACDEF")
False

x의 요소가 해시 할 수없는 경우 다음 목록을 사용해야합니다 seen.

>>> def allUnique(x):
...     seen = list()
...     return not any(i in seen or seen.append(i) for i in x)
...
>>> allUnique([list("ABC"), list("DEF")])
True
>>> allUnique([list("ABC"), list("DEF"), list("ABC")])
False


답변

조기 종료 솔루션은 다음과 같습니다.

def unique_values(g):
    s = set()
    for x in g:
        if x in s: return False
        s.add(x)
    return True

그러나 작은 경우 또는 조기 종료가 일반적인 경우가 아니라면 len(x) != len(set(x))가장 빠른 방법이 될 것으로 기대 합니다.


답변

속도 :

import numpy as np
x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
np.unique(x).size == len(x)


답변

모든 항목을 세트에 추가하고 길이를 확인하는 것은 어떻습니까?

len(set(x)) == len(x)


답변

A와 대안 set, 당신은을 사용할 수 있습니다 dict.

len({}.fromkeys(x)) == len(x)


답변

sorted 및 groupby를 사용하는 또 다른 접근 방식 :

from itertools import groupby
is_unique = lambda seq: all(sum(1 for _ in x[1])==1 for x in groupby(sorted(seq)))

정렬이 필요하지만 첫 번째 반복 값에서 종료됩니다.