목록의 모든 요소가 고유한지 확인
목록의 모든 요소가 고유한지 확인하는 가장 좋은 방법은 무엇입니까 (기존 방식과 같이 가장 좋은 방법)?
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)))
정렬이 필요하지만 첫 번째 반복 값에서 종료됩니다.
다음은 재귀 적 조기 종료 함수입니다.
def distinct(L):
if len(L) == 2:
return L[0] != L[1]
H = L[0]
T = L[1:]
if (H in T):
return False
else:
return distinct(T)
기능적 스타일의 접근 방식을 사용하면서 이상한 (느린) 변환을 사용하지 않고도 충분히 빠릅니다.
재미를위한 재귀 O (N 2 ) 버전 은 다음과 같습니다 .
def is_unique(lst):
if len(lst) > 1:
return is_unique(s[1:]) and (s[0] not in s[1:])
return True
이건 어때요
def is_unique(lst):
if not lst:
return True
else:
return Counter(lst).most_common(1)[0][1]==1
Pandas 데이터 프레임에서 유사한 접근 방식을 사용하여 열 내용에 고유 한 값이 포함되어 있는지 테스트합니다.
if tempDF['var1'].size == tempDF['var1'].unique().size:
print("Unique")
else:
print("Not unique")
나에게 이것은 백만 개가 넘는 행을 포함하는 날짜 프레임의 int 변수에서 즉각적입니다.
Yan의 구문 (len (x)> len (set (x)))을 사용할 수 있지만 set (x) 대신 함수를 정의하십시오.
def f5(seq, idfun=None):
# order preserving
if idfun is None:
def idfun(x): return x
seen = {}
result = []
for item in seq:
marker = idfun(item)
# in old Python versions:
# if seen.has_key(marker)
# but in new ones:
if marker in seen: continue
seen[marker] = 1
result.append(item)
return result
그리고 len (x)> len (f5 (x))를 수행합니다. 이것은 빠르며 주문 보존이기도합니다.
코드는 http://www.peterbe.com/plog/uniqifiers-benchmark 에서 가져 왔습니다.
all answer above are good but i prefer to use all_unique
example from 30 seconds of python
you need to use set()
on the given list to remove duplicates, compare its length with the length of the list.
def all_unique(lst):
return len(lst) == len(set(lst))
it returns True
if all the values in a flat list are unique
, False
otherwise
x = [1,2,3,4,5,6]
y = [1,2,2,3,4,5]
all_unique(x) # True
all_unique(y) # False
For begginers:
def AllDifferent(s):
for i in range(len(s)):
for i2 in range(len(s)):
if i != i2:
if s[i] == s[i2]:
return False
return True
참고URL : https://stackoverflow.com/questions/5278122/checking-if-all-elements-in-a-list-are-unique
'Programing' 카테고리의 다른 글
Android Room-단순 선택 쿼리-기본 스레드에서 데이터베이스에 액세스 할 수 없음 (0) | 2020.09.10 |
---|---|
jquery-매우 큰 테이블에서 모든 행을 제거하는 가장 빠른 방법 (0) | 2020.09.10 |
전송 끝 점이 연결되지 않았습니다. (0) | 2020.09.10 |
DOM의 JavaScript 이동 요소 (0) | 2020.09.10 |
jQuery 양식 직렬화-빈 문자열 (0) | 2020.09.10 |