Jaki jest najlepszy sposób (najlepiej jak w konwencjonalny sposób) sprawdzenia, czy wszystkie elementy listy są unikalne?
Moje obecne podejście przy użyciu a Counter
to:
>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
if values > 1:
# do something
Czy mogę zrobić lepiej?
len(x) > len(set(x))
jest True, gdy elementy wx
NIE są unikalne. Tytuł tego pytania brzmi dokładnie odwrotnie: „Sprawdzanie, czy wszystkie elementy na liście są unikalne”Oto dwuliniowiec, który również wykona wczesne wyjście:
Jeśli elementy x nie są hashowane, będziesz musiał skorzystać z listy dla
seen
:źródło
Może to być rozwiązanie umożliwiające wczesne wyjście
Jednak w małych przypadkach lub jeśli wcześniejsze wyjście nie jest częstym przypadkiem, spodziewałbym się
len(x) != len(set(x))
, że będzie to najszybsza metoda.źródło
s = set()
...return not any(s.add(x) if x not in s else True for x in g)
len(x) != len(set(x))
się, że będziesz szybszy, jeśli wczesne wychodzenie nie jest powszechne? Czy obie operacje nie są O (len (x)) ? (gdziex
jest oryginalna lista)if x in s
wewnątrz pętli O (len (x)) .dla prędkości:
źródło
Co powiesz na dodanie wszystkich wpisów do zestawu i sprawdzenie jego długości?
źródło
len()
.Alternatywnie do pliku
set
możesz użyć plikudict
.źródło
Całkowicie inne podejście, używając sortowania i grupowania:
Wymaga sortowania, ale kończy na pierwszej powtórzonej wartości.
źródło
groupby
i znalazłem tę odpowiedź. Uważam to za najbardziej eleganckie, ponieważ jest to pojedyncze wyrażenie i działa z wbudowanymi narzędziami bez konieczności stosowania dodatkowych zmiennych lub instrukcji pętli.id()
funkcji do ich sortowania, ponieważ jest to warunek wstępnygroupby()
pracy:groupby(sorted(seq), key=id)
Oto rekurencyjna wersja O (N 2 ) dla zabawy:
źródło
Oto rekurencyjna funkcja wczesnego wyjścia:
Jest dla mnie wystarczająco szybki bez używania dziwnych (wolnych) konwersji, mając jednocześnie podejście funkcjonalne.
źródło
H in T
przeprowadza wyszukiwanie liniowe iT = L[1:]
kopiuje pociętą część listy, więc będzie to znacznie wolniejsze niż inne rozwiązania, które były sugerowane na dużych listach. Myślę, że jest to O (N ^ 2), podczas gdy większość pozostałych to O (N) (zbiory) lub O (N log N) (rozwiązania oparte na sortowaniu).Co powiesz na to
źródło
Możesz użyć składni Yana (len (x)> len (set (x))), ale zamiast set (x) zdefiniuj funkcję:
i wykonaj len (x)> len (f5 (x)). To będzie szybkie i jednocześnie pozwoli zachować porządek.
Kod tam zaczerpnięto z: http://www.peterbe.com/plog/uniqifiers-benchmark
źródło
x = range(1000000) + range(1000000)
uruchomienie set (x) jest szybsze niż f5 (x). Zamówienie nie jest wymagane w pytaniu, ale nawet posortowane uruchomienie (set (x)) jest nadal szybsze niż f5 (x)Używając podobnego podejścia w ramce danych Pandas, aby sprawdzić, czy zawartość kolumny zawiera unikalne wartości:
Dla mnie jest to natychmiastowe dla zmiennej int w ramce dat zawierającej ponad milion wierszy.
źródło
wszystkie powyższe odpowiedzi są dobre, ale wolę używać
all_unique
przykładu z 30 sekund Pythonamusisz użyć
set()
na podanej liście, aby usunąć duplikaty, porównać jego długość z długością listy.zwraca,
True
jeśli wszystkie wartości z płaskiej listy sąunique
, wFalse
przeciwnym razieźródło
Dla początkujących:
źródło