711 Stimmen

Abrufen des Index des zurückgegebenen maximalen oder minimalen Elements mit max()/min() in einer Liste

Ich verwende Pythons max y min Funktionen auf Listen für einen Minimax-Algorithmus, und ich brauche den Index des Wertes, der von max() ou min() . Mit anderen Worten, ich muss wissen, welcher Zug den höchsten (im Zug des ersten Spielers) oder niedrigsten (im Zug des zweiten Spielers) Wert ergab.

for i in range(9):
    new_board = current_board.new_board_with_move([i / 3, i % 3], player)

    if new_board:
        temp = min_max(new_board, depth + 1, not is_min_level)  
        values.append(temp)

if is_min_level:
    return min(values)
else:
    return max(values)

Ich muss in der Lage sein, den tatsächlichen Index des Mindest- oder Höchstwerts zurückzugeben, nicht nur den Wert.

722voto

gg349 Punkte 20364

Angenommen, Sie haben eine Liste values = [3,6,1,5] und benötigen den Index des kleinsten Elements, d. h. index_min = 2 in diesem Fall.

Vermeiden Sie die Lösung mit itemgetter() die in den anderen Antworten aufgeführt sind, und verwenden Sie stattdessen

index_min = min(range(len(values)), key=values.__getitem__)

weil es nicht erforderlich ist, die import operator noch zu verwenden enumerate und ist immer schneller (siehe Benchmark unten) als eine Lösung mit itemgetter() .

Wenn Sie mit Numpy-Arrays arbeiten oder es sich leisten können numpy als Abhängigkeit zu verwenden, sollten Sie auch

import numpy as np
index_min = np.argmin(values)

Dies ist schneller als die erste Lösung, selbst wenn man sie auf eine reine Python-Liste anwendet:

  • sie ist größer als ein paar Elemente (etwa 2**4 Elemente auf meinem Rechner)
  • können Sie sich die Speicherkopie von einer reinen Liste zu einer numpy Array

wie dieser Benchmark aufzeigt: enter image description here

Ich habe den Benchmark auf meinem Rechner mit Python 2.7 für die beiden obigen Lösungen (blau: reines Python, erste Lösung) (rot, Numpy-Lösung) und für die Standardlösung basierend auf itemgetter() (schwarz, Referenzlösung). Derselbe Benchmark mit Python 3.5 zeigte, dass die Methoden im Vergleich zu dem oben dargestellten Fall mit Python 2.7 genau gleich sind

612voto

too much php Punkte 85034
if is_min_level:
    return values.index(min(values))
else:
    return values.index(max(values))

370voto

Matt Anderson Punkte 18343

Sie können den Min/Max-Index und den Wert gleichzeitig ermitteln, wenn Sie die Elemente in der Liste aufzählen, aber Min/Max an den ursprünglichen Werten der Liste durchführen. Zum Beispiel so:

import operator
min_index, min_value = min(enumerate(values), key=operator.itemgetter(1))
max_index, max_value = max(enumerate(values), key=operator.itemgetter(1))

Auf diese Weise wird die Liste nur einmal für min (oder max) durchlaufen.

156voto

dr.haz Punkte 1377

Wenn Sie den Index von max innerhalb einer Liste von Zahlen finden wollen (was Ihr Fall zu sein scheint), dann schlage ich vor, Sie verwenden numpy:

import numpy as np
ind = np.argmax(mylist)

55voto

Ant6n Punkte 1718

Eine einfachere Lösung könnte darin bestehen, das Werte-Array in ein Array von Wert-Index-Paaren umzuwandeln und den Maximalwert bzw. den Minimalwert davon zu nehmen. Dies würde den größten/kleinsten Index ergeben, der das Maximum/Minimum hat (d.h. Paare werden verglichen, indem zuerst das erste Element und dann das zweite Element verglichen wird, wenn die ersten gleich sind). Beachten Sie, dass es nicht notwendig ist, das Array tatsächlich zu erstellen, da min/max Generatoren als Eingabe zulassen.

values = [3,4,5]
(m,i) = max((v,i) for i,v in enumerate(values))
print (m,i) #(5, 2)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X