Was ist der pythischste Weg um sicherzustellen, dass alle Elemente einer Liste unterschiedlich sind?

8

Ich habe eine Liste in Python, die ich als Teil des Programms erzeuge. Ich habe eine starke Annahme, dass diese alle verschieden sind, und ich überprüfe das mit einer Behauptung.

So mache ich es jetzt:

Wenn es zwei Elemente gibt:

%Vor%

Wenn es drei gibt:

%Vor%

Und wenn ich das jemals mit vier Elementen machen muss, werde ich verrückt.

Gibt es eine bessere Möglichkeit sicherzustellen, dass alle Elemente der Liste eindeutig sind?

    
Nathan Fellman 30.09.2009, 23:07
quelle

7 Antworten

26

Vielleicht in etwa so:

%Vor%     
Elias Zamaria 30.09.2009, 23:09
quelle
18

Die beliebtesten Antworten sind O (N) (gut! -), aber wie @Paul und @Mark darauf hinweisen, müssen die Elemente der Liste hashbar sein. Sowohl @Paul als auch @ Marks vorgeschlagene Ansätze für nicht hashbare Elemente sind allgemein, aber nehmen O (N-Quadrat) - d. H. Eine Menge.

Wenn die Einträge Ihrer Liste nicht hashbar sind, aber sind vergleichbar, können Sie es besser machen ... hier ist ein Ansatz, der immer so schnell wie möglich funktioniert, angesichts der Art der Listenelemente.

%Vor%

Dies ist O (N) wo möglich (alle Artikel sind waschbar), O (N log N) als der häufigste Fallback (einige Artikel nicht hashbar, aber alle vergleichbar), O (N squared) wo unvermeidlich (einige Artikel nicht hashbar), zB dicts, und einige nicht vergleichbare, zB komplexe Zahlen).

Die Inspiration für diesen Code stammt von einem alten Rezept des großartigen Tim Peters, das sich dadurch unterschied, dass er tatsächlich eine Liste einzigartiger Artikel produzierte (und auch so weit her war, dass set nicht da war - es musste einen% verwenden co_de% ...! -), aber grundsätzlich mit identischen Problemen konfrontiert.

    
Alex Martelli 01.10.2009 01:45
quelle
7

Wie wäre es damit:

%Vor%

Dies setzt voraus, dass Elemente in x hashbar sind.

    
Arkady 30.09.2009 23:11
quelle
2

Hoffentlich sind alle Elemente in Ihrer Sequenz unveränderlich - wenn nicht, können Sie set nicht in der Sequenz aufrufen.

%Vor%

Wenn Sie änderbare Elemente haben, können Sie die Elemente nicht hashen und Sie müssen die Liste ziemlich oft überprüfen:

%Vor%

%Vor%     
Mark Rushakoff 30.09.2009 23:31
quelle
1

Beim Erstellen der Liste können Sie prüfen, ob der Wert bereits vorhanden ist, z. B .:

%Vor%

Der Vorteil ist, dass die kollidierende Variable gemeldet wird.

    
Transom 30.09.2009 23:40
quelle
0

Sie könnten die Liste bearbeiten, um eine Kopie zu erstellen, die bekannt sein soll:

%Vor%

Oder wenn die seq-Elemente nicht hashbar sind:

%Vor%

Und das wird die Dinge in Ordnung halten (Duplikate natürlich weglassen).

    
PaulMcG 01.10.2009 01:22
quelle
0

Ich würde das verwenden:

%Vor%     
Jeremy 01.10.2009 10:32
quelle

Tags und Links