Ich verwende Pythons max
und min
Funktionen in Listen für einen Minimax-Algorithmus und benötige den Index des von max()
oder zurückgegebenen Werts min()
. Mit anderen Worten, ich muss wissen, welcher Zug den Maximalwert (beim Zug eines ersten Spielers) oder den Minimalwert (beim zweiten Spieler) ergab.
for i in range(9):
newBoard = currentBoard.newBoardWithMove([i / 3, i % 3], player)
if newBoard:
temp = minMax(newBoard, depth + 1, not isMinLevel)
values.append(temp)
if isMinLevel:
return min(values)
else:
return max(values)
Ich muss in der Lage sein, den tatsächlichen Index des Min- oder Max-Werts zurückzugeben, nicht nur den Wert.
divmod
existiert, um zu verhindern, dass man[i / 3, i % 3]
viel sagen muss .Antworten:
quelle
tmp = min(values); return values.index(tmp)
Angenommen, Sie haben eine Liste
values = [3,6,1,5]
und benötigen den Index des kleinsten Elements, dhindex_min = 2
in diesem Fall.Vermeiden Sie die
itemgetter()
in den anderen Antworten dargestellte Lösung und verwenden Sie sie stattdessenweil es weder benötigt
import operator
noch verwendet werdenenumerate
muss und immer schneller ist (Benchmark unten) als eine Lösung, die verwendet wirditemgetter()
.Wenn Sie mit Numpy-Arrays zu tun haben oder es sich
numpy
als Abhängigkeit leisten können , sollten Sie auch die Verwendung in Betracht ziehenDies ist schneller als die erste Lösung, selbst wenn Sie sie auf eine reine Python-Liste anwenden, wenn:
numpy
Array leistenwie dieser Benchmark zeigt:
Ich habe den Benchmark auf meinem Computer mit Python 2.7 für die beiden oben genannten Lösungen (blau: reines Python, erste Lösung) (rot, numpy-Lösung) und für die Standardlösung basierend auf
itemgetter()
(schwarz, Referenzlösung) ausgeführt. Der gleiche Benchmark mit Python 3.5 zeigte, dass die Methoden genau den gleichen wie der oben vorgestellte Fall von Python 2.7 vergleichenquelle
xrange()
ist jetzt veraltet, können Sie verwendenrange()
import numpy as np; x = [2.3, -1.4]; np.argmin(x)
. Sie werden sehen, dass dies auchargmin
auf Schwimmern funktioniertSie können den Min / Max-Index und den Wert gleichzeitig finden, wenn Sie die Elemente in der Liste auflisten, aber Min / Max für die ursprünglichen Werte der Liste ausführen. Wie so:
Auf diese Weise wird die Liste nur einmal für min (oder max) durchlaufen.
quelle
key=lambda p: p[1]
Wenn Sie den Index von max in einer Liste von Zahlen finden möchten (was Ihr Fall zu sein scheint), empfehle ich Ihnen, numpy zu verwenden:
quelle
Möglicherweise wäre eine einfachere Lösung, das Array von Werten in ein Array von Werten, Indexpaaren, umzuwandeln und das Maximum / Min davon zu nehmen. Dies würde den größten / kleinsten Index ergeben, der das Maximum / Min hat (dh Paare werden verglichen, indem zuerst das erste Element verglichen wird und dann das zweite Element verglichen wird, wenn die ersten gleich sind). Beachten Sie, dass es nicht erforderlich ist, das Array tatsächlich zu erstellen, da Min / Max Generatoren als Eingabe zulassen.
quelle
Gibt Ihnen den ersten Index des Minimums.
quelle
Ich denke, das Beste, was Sie tun können, ist, die Liste in a zu konvertieren
numpy array
und diese Funktion zu verwenden:quelle
Ich war auch daran interessiert und verglich einige der vorgeschlagenen Lösungen mit perfplot (einem meiner Lieblingsprojekte ).
Es stellt sich heraus, dass der Nummel Argmin ist ,
ist die schnellste Methode für ausreichend große Listen, selbst bei der impliziten Konvertierung von der Eingabe
list
in anumpy.array
.Code zum Generieren des Plots:
quelle
Verwenden Sie ein Numpy-Array und die Funktion argmax ()
quelle
Versuchen Sie Folgendes, nachdem Sie die Maximalwerte erhalten haben:
Viel einfacher als viele Optionen.
quelle
Ich denke, die obige Antwort löst Ihr Problem, aber ich dachte, ich würde eine Methode teilen, die Ihnen das Minimum und alle Indizes gibt, in denen das Minimum erscheint.
Dies passiert die Liste zweimal, ist aber immer noch ziemlich schnell. Es ist jedoch etwas langsamer als das Finden des Index der ersten Begegnung des Minimums. Wenn Sie also nur eines der Minima benötigen, verwenden Sie die Lösung von Matt Anderson . Wenn Sie alle benötigen, verwenden Sie diese.
quelle
Verwenden Sie die Funktion numpy.where des Numpy-Moduls
Für den Index des Mindestwerts:
Für den Index des Maximalwerts:
In der Tat ist diese Funktion viel leistungsfähiger. Sie können alle Arten von Booleschen Operationen ausführen. Für einen Wertindex zwischen 3 und 60:
quelle
argmin()
was Sie hier getan haben.Dies ist einfach möglich mit dem eingebauten in
enumerate()
undmax()
Funktion und das optionalekey
Argument dermax()
Funktion und einen einfachen Lambda - Ausdruck:In den Dokumenten
max()
heißt es, dass daskey
Argument eine Funktion wie in derlist.sort()
Funktion erwartet . Siehe auch Sortieren .Es funktioniert genauso für
min()
. Übrigens gibt es den ersten Max / Min-Wert zurück.quelle
Angenommen, Sie haben eine Liste wie:
Die folgenden zwei Methoden sind ziemlich kompakte Methoden, um ein Tupel mit dem minimalen Element und seinem Index zu erhalten. Beide nehmen eine ähnliche Bearbeitungszeit. Ich mag die Zip-Methode besser, aber das ist mein Geschmack.
Zip-Methode
Methode aufzählen
quelle
Solange Sie wissen, wie man Lambda und das "Schlüssel" -Argument verwendet, ist eine einfache Lösung:
quelle
n
kann es merklich langsamer sein.So einfach ist das :
quelle
Warum zuerst Indizes hinzufügen und dann umkehren? Die Funktion Enumerate () ist nur ein Sonderfall der Verwendung der Funktion zip (). Lassen Sie es uns angemessen verwenden:
quelle
Nur eine kleine Ergänzung zu dem, was bereits gesagt wurde.
values.index(min(values))
scheint den kleinsten Index von min zurückzugeben. Folgendes erhält den größten Index:Die letzte Zeile kann weggelassen werden, wenn der Nebeneffekt der Umkehrung keine Rolle spielt.
Durch alle Vorkommen iterieren
Um es kurz zu machen. Es ist wahrscheinlich eine bessere Idee,
min(values), values.count(min)
außerhalb der Schleife zwischenzuspeichern.quelle
reversed(…)
statt….reverse()
ist wahrscheinlich vorzuziehen, da es nicht mutiert und trotzdem einen Generator zurückgibt. Und alle Vorkommnisse könnten auch seinminv = min(values); indices = [i for i, v in enumerate(values) if v == minv]
Eine einfache Möglichkeit, die Indizes mit minimalem Wert in einer Liste zu finden, wenn Sie keine zusätzlichen Module importieren möchten:
Dann wählen Sie zum Beispiel den ersten:
quelle
Haben Sie nicht genügend Wiederholungen, um die vorhandene Antwort zu kommentieren.
Aber für https://stackoverflow.com/a/11825864/3920439 antworten
Dies funktioniert für Ganzzahlen, aber nicht für ein Array von Floats (zumindest in Python 3.6). Es wird ausgelöst
TypeError: list indices must be integers or slices, not float
quelle
https://docs.python.org/3/library/functions.html#max
Wenn mehrere Elemente maximal sind, gibt die Funktion das erste gefundene zurück. Dies steht im Einklang mit anderen Werkzeugen zur Erhaltung der Sortierstabilität, wie z
sorted(iterable, key=keyfunc, reverse=True)[0]
Um mehr als nur die ersten zu erhalten, verwenden Sie die Sortiermethode.
quelle
Was ist damit:
Es erstellt ein Wörterbuch aus den Elementen in
a
als Schlüssel und ihren Indizes als Werte unddict(zip(a,range(len(a))))[max(a)]
gibt somit den Wert zurück, der dem Schlüssel entspricht, dermax(a)
der Index des Maximums in a ist. Ich bin ein Anfänger in Python, daher weiß ich nichts über die rechnerische Komplexität dieser Lösung.quelle