Ich muss die n größten Elemente in einer Liste von Tupeln finden. Hier ist ein Beispiel für die Top 3 Elemente.
%Vor% Ich habe versucht, heapq.nlargest
zu verwenden. Es gibt jedoch nur die ersten drei größten Elemente zurück und gibt keine Duplikate zurück. Zum Beispiel
Ich kann nur an einen Brute-Force-Ansatz denken. Das ist was ich habe und es funktioniert.
%Vor%Irgendwelche anderen Ideen, wie ich das umsetzen kann? Danke!
EDIT: timeit
Ergebnisse für eine Liste von 1 Million Elementen zeigen, dass mhyfritz's Lösung läuft in 1/3 der Zeit der Brute-Force. Ich wollte die Frage nicht zu lange stellen. Also fügte weitere Details in meine Antwort
Wenn Sie die Eingabedaten bereits so sortiert haben, ist es sehr wahrscheinlich, dass Ihre Lösung ein wenig besser ist als die Heap-basierte.
Ihre Algorithmuskomplexität ist O (n), während die heapq-basierte Eins konzeptionell O (n * log (3)) ist und wahrscheinlich mehr Durchläufe über die Daten benötigt, um sie richtig anzuordnen.
Einige zusätzliche Details ... Ich habe beide mhyfritz's ausgezeichnete Lösung , die itertools
und und meinen Code (brute-force) verwendet.
Hier sind die timeit
Ergebnisse für n = 10
und für eine Liste mit 1 Million Elementen.
Falls jemand neugierig ist, hier ist eine Spur davon, wie sein Code funktioniert.
%Vor%Wenn Sie die Eingabedaten bereits so sortiert haben, ist es sehr wahrscheinlich, dass Ihre Lösung ein wenig besser ist als die Heap-basierte.
Ihre Algorithmuskomplexität ist O (n), während die heapq-basierte Eins konzeptionell O (n * log (3)) ist und wahrscheinlich mehr Durchläufe über die Daten benötigt, um sie richtig anzuordnen.
Einige zusätzliche Details ... Ich habe beide mhyfritz's ausgezeichnete Lösung , die onlyTopThreeKeys
und und meinen Code (brute-force) verwendet.
Hier sind die itertools.groupby
Ergebnisse für %code% und für eine Liste mit 1 Million Elementen.
Falls jemand neugierig ist, hier ist eine Spur davon, wie sein Code funktioniert.
%Vor%Ich muss die n größten Elemente in einer Liste von Tupeln finden. Hier ist ein Beispiel für die Top 3 Elemente.
%Vor%Ich habe versucht, %code% zu verwenden. Es gibt jedoch nur die ersten drei größten Elemente zurück und gibt keine Duplikate zurück. Zum Beispiel
%Vor%Ich kann nur an einen Brute-Force-Ansatz denken. Das ist was ich habe und es funktioniert.
%Vor%Irgendwelche anderen Ideen, wie ich das umsetzen kann? Danke!
EDIT: %code% Ergebnisse für eine Liste von 1 Million Elementen zeigen, dass mhyfritz's Lösung läuft in 1/3 der Zeit der Brute-Force. Ich wollte die Frage nicht zu lange stellen. Also fügte weitere Details in meine Antwort
Ich nehme es aus Ihrem Code-Snippet, dass %code% in w.r.t gruppiert ist. Kategorie-1 . Folgendes sollte dann funktionieren:
%Vor%Wie ist es damit? Es gibt nicht genau das gewünschte Ergebnis zurück, da es in %code% umgekehrt sortiert.
%Vor%Dies ist die Idee, ein dict mit dem Wert, nach dem sortiert werden soll, als Schlüssel und einer Liste der Tupel, die diesen Wert als Werte haben, zu erstellen.
Dann sortieren Sie die Elemente des Diktats mit den Schlüsseln, holen Sie die Elemente von oben, extrahieren Sie ihre Werte und verbinden Sie sie.
Schneller, hässlicher Code:
%Vor%Nur um Ihnen ein paar Ideen zu geben, hoffe es hilft. Wenn Sie etwas Klärung benötigen, fragen Sie in den Kommentaren
Ergebnis:
%Vor%flache Liste : Ich habe die obige Methode durchgeführt, weil Sie dadurch mehr Informationen erhalten. Um nur eine flache Liste zu erhalten, verwenden Sie closures, um Ergebnisse mit %code% :
auszugeben %Vor%Ergebnis:
%Vor%Sie können %code% auch verwenden, wenn Ihre Eingabe garantiert wie in Ihrer Beispieleingabe sortiert ist. Dies führt jedoch dazu, dass Ihr Code bei Änderungen der Sortierung bricht.
Dies ist die Idee, ein dict mit dem Wert, nach dem sortiert werden soll, als Schlüssel und einer Liste der Tupel, die diesen Wert als Werte haben, zu erstellen.
Dann sortieren Sie die Elemente des Diktats mit den Schlüsseln, holen Sie die Elemente von oben, extrahieren Sie ihre Werte und verbinden Sie sie.
Schneller, hässlicher Code:
%Vor%Nur um Ihnen ein paar Ideen zu geben, hoffe es hilft. Wenn Sie etwas Klärung benötigen, fragen Sie in den Kommentaren