Was ist der beste Weg (am besten wie auf herkömmliche Weise), um zu überprüfen, ob alle Elemente in einer Liste eindeutig sind?
Mein aktueller Ansatz mit a Counter
ist:
>>> x = [1, 1, 1, 2, 3, 4, 5, 6, 2]
>>> counter = Counter(x)
>>> for values in counter.itervalues():
if values > 1:
# do something
Kann ich es besser machen
len(x) > len(set(x))
Ist wahr, wenn die Elemente inx
NICHT eindeutig sind. Unter dieser Titel Frage fragt genau das Gegenteil: „Überprüfen , ob alle Elemente in einer Liste sind einzigartig“Hier ist ein Zweiliner, der auch vorzeitig aussteigen wird:
Wenn die Elemente von x nicht hashbar sind, müssen Sie eine Liste verwenden für
seen
:quelle
Eine Early-Exit-Lösung könnte sein
Für kleine Fälle oder wenn ein vorzeitiges Beenden nicht der übliche Fall ist, würde ich erwarten
len(x) != len(set(x))
, dass dies die schnellste Methode ist.quelle
s = set()
...return not any(s.add(x) if x not in s else True for x in g)
len(x) != len(set(x))
, schneller zu sein, wenn ein vorzeitiges Beenden nicht üblich ist? Sind nicht beide Operationen O (len (x)) ? (Wox
ist die ursprüngliche Liste)if x in s
innerhalb der O (len (x)) for-Schleife prüfen .für Geschwindigkeit:
quelle
Wie wäre es, wenn Sie alle Einträge zu einem Set hinzufügen und dessen Länge überprüfen?
quelle
len()
.Alternativ zu a
set
können Sie a verwendendict
.quelle
Ein ganz anderer Ansatz, sortiert und gruppiert:
Es erfordert eine Sortierung, wird jedoch beim ersten wiederholten Wert beendet.
quelle
groupby
und fand diese Antwort. Ich finde das am elegantesten, da dies ein einzelner Ausdruck ist und mit den integrierten Tools funktioniert, ohne dass eine zusätzliche Variable oder Schleifenanweisung erforderlich ist.id()
Funktion sortieren, da dies eine Voraussetzung fürgroupby()
die Arbeit ist:groupby(sorted(seq), key=id)
Hier ist eine rekursive O (N 2 ) -Version zum Spaß:
quelle
Hier ist eine rekursive Early-Exit-Funktion:
Es ist schnell genug für mich, ohne seltsame (langsame) Konvertierungen zu verwenden, während ich einen funktionalen Ansatz habe.
quelle
H in T
führt eine lineare Suche durch undT = L[1:]
kopiert den in Scheiben geschnittenen Teil der Liste, sodass dies viel langsamer ist als die anderen Lösungen, die auf großen Listen vorgeschlagen wurden. Ich denke, es ist O (N ^ 2), während die meisten anderen O (N) (Mengen) oder O (N log N) (sortierungsbasierte Lösungen) sind.Wie wäre es damit
quelle
Sie können die Yan-Syntax (len (x)> len (set (x))) verwenden, aber anstelle von set (x) eine Funktion definieren:
und mache len (x)> len (f5 (x)). Dies wird schnell gehen und ist auch auftragserhaltend.
Der dortige Code stammt von: http://www.peterbe.com/plog/uniqifiers-benchmark
quelle
x = range(1000000) + range(1000000)
ist das Ausführen von set (x) schneller als f5 (x). Reihenfolge ist keine Voraussetzung in der Frage, aber selbst das Ausführen sortiert (Satz (x)) ist immer noch schneller als f5 (x)Verwenden eines ähnlichen Ansatzes in einem Pandas-Datenrahmen, um zu testen, ob der Inhalt einer Spalte eindeutige Werte enthält:
Für mich erfolgt dies sofort für eine int-Variable in einem Datumsrahmen, der über eine Million Zeilen enthält.
quelle
Alle Antworten oben sind gut, aber ich bevorzuge es, ein
all_unique
Beispiel aus 30 Sekunden Python zu verwendenSie müssen
set()
die angegebene Liste verwenden, um Duplikate zu entfernen. Vergleichen Sie deren Länge mit der Länge der Liste.es gibt ,
True
wenn alle Werte in einer flachen Liste sindunique
,False
sonstquelle
Für Anfänger:
quelle