Python: Den letzten Index von min Element finden?

7

Zum Beispiel [1,2,3,4,1,2]

hat min Element 1, aber es tritt das letzte Mal bei Index 4 auf.

    
John Smith 30.07.2013, 16:34
quelle

6 Antworten

3
%Vor%

Nach dem Kommentar aktualisieren:

Der Nebeneffekt kann durch erneutes Umkehren entfernt werden (aber das ist natürlich ziemlich ineffizient).

%Vor%     
Michel Keijzers 30.07.2013, 16:38
quelle
11
%Vor%

Keine Änderung an der ursprünglichen Liste, funktioniert für beliebige Iterables und erfordert nur einen Durchlauf.

Dies erzeugt ein iterbares Tupel, wobei der erste Wert das ursprüngliche Element aus der Liste ist und das zweite Element der negierte Index ist. Wenn Sie das Minimum in diesem iterierbaren Tupel finden, werden zuerst die Werte und dann die Indizes verglichen. Sie erhalten also ein Tupel von (min_value, lost_negative_index). Indem Sie das zweite Element aus diesem Tupel nehmen und es erneut negieren, erhalten Sie den höchsten Index des Mindestwerts.

Hier ist eine alternative Version, die sehr ähnlich ist, aber eine Schlüsselfunktion für min() verwendet:

%Vor%

Beachten Sie, dass diese Version nur für Sequenzen (Listen, Tupel, Strings usw.) funktioniert.

    
Andrew Clark 30.07.2013 16:42
quelle
3

len(list_) - list_[::-1].index(min(list_)) - 1

Ermitteln Sie die Länge der Liste, subtrahieren Sie davon den Index der Min der Liste in der umgekehrten Liste, und subtrahieren Sie dann 1.

    
rlms 30.07.2013 16:38
quelle
2

Nicht so effizient (ich bin ein Anfänger in Python), aber funktioniert auch gut. Das idx wird nur den letzten Index des minimalen Elements enthalten. Ich denke, dass M.Keijzers Methode die beste ist.

%Vor%     
akson128 30.07.2013 16:43
quelle
2
%Vor%

Dies verwendet die Slice-Notation list[::-1] , um eine flache Kopie einer umgekehrten Liste zurückzugeben, so dass sie Ihre ursprüngliche Liste nicht ändert und dann nach dem Minimalwert in dieser Liste sucht

%Vor%     
Stephan 30.07.2013 17:26
quelle
2
%Vor%

Erklärung

reversed gibt den Iterator zurück, der die ursprüngliche Liste durchläuft, ohne eine temporäre Liste zu erstellen:

%Vor%

izip und count sind faul, und es scheint keine Byte-Code-Ausführung zu geben, also erwarte ich, dass diese Lösung ziemlich schnell und einlinig ist.

Zeitvergleiche

Ссылка

Lösungen mit index erwiesen sich als die schnellsten, obwohl sie 2 Pässe über die Liste stellen mussten. Andere Lösungen erzeugen bei jeder Iteration Hilfstupel in Generatoren, und ich denke, das ist der Grund, warum diese Lösungen langsamer sind. Selbst die Lösung von akson128, die die Ausführung von Byte-Code aufruft, ist noch schneller (weil sie keine Tupel erzeugen muss).

    
ovgolovin 30.07.2013 16:43
quelle

Tags und Links