Programing

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

lottogame 2020. 9. 10. 08:19
반응형

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


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

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

반응형