[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)))
정렬이 필요하지만 첫 번째 반복 값에서 종료됩니다.