Zum Beispiel [1,2,3,4,1,2]
hat min Element 1, aber es tritt das letzte Mal bei Index 4 auf.
Nach dem Kommentar aktualisieren:
Der Nebeneffekt kann durch erneutes Umkehren entfernt werden (aber das ist natürlich ziemlich ineffizient).
%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:
Beachten Sie, dass diese Version nur für Sequenzen (Listen, Tupel, Strings usw.) funktioniert.
reversed
gibt den Iterator zurück, der die ursprüngliche Liste durchläuft, ohne eine temporäre Liste zu erstellen:
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.
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).