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.

38voto

Andy Punkte 441
seq=[1.1412, 4.3453, 5.8709, 0.1314]
seq.index(min(seq))

Sie erhalten einen ersten Index für das Minimum.

30voto

Nico Schlömer Punkte 45358

Ich habe mich auch dafür interessiert und einige der vorgeschlagenen Lösungen verglichen, indem ich Perfplot (ein Lieblingsprojekt von mir).

Es stellt sich heraus, dass argmin von numpy ,

numpy.argmin(x)

ist die schnellste Methode für ausreichend große Listen, selbst mit der impliziten Konvertierung von der Eingabe list zu einer numpy.array .

enter image description here


Code für die Erstellung des Plots:

import numpy
import operator
import perfplot

def min_enumerate(a):
    return min(enumerate(a), key=lambda x: x[1])[0]

def min_enumerate_itemgetter(a):
    min_index, min_value = min(enumerate(a), key=operator.itemgetter(1))
    return min_index

def getitem(a):
    return min(range(len(a)), key=a.__getitem__)

def np_argmin(a):
    return numpy.argmin(a)

perfplot.show(
    setup=lambda n: numpy.random.rand(n).tolist(),
    kernels=[
        min_enumerate,
        min_enumerate_itemgetter,
        getitem,
        np_argmin,
        ],
    n_range=[2**k for k in range(15)],
    logx=True,
    logy=True,
    )

22voto

Akshaya Natarajan Punkte 1605

Ich denke, am besten ist es, die Liste in eine numpy array und verwenden Sie diese Funktion:

a = np.array(list)
idx = np.argmax(a)

11voto

Burak Bağdatlı Punkte 121

Ich denke, die obige Antwort löst Ihr Problem, aber ich dachte, ich würde Ihnen eine Methode vorstellen, die Ihnen das Minimum und alle Indizes liefert, in denen das Minimum vorkommt.

minval = min(mylist)
ind = [i for i, v in enumerate(mylist) if v == minval]

Dies führt zweimal über die Liste, ist aber immer noch recht schnell. Es ist jedoch etwas langsamer als die Suche nach dem Index der ersten Begegnung mit dem Minimum. Wenn Sie also nur eines der Minima benötigen, verwenden Sie Matt Anderson Wenn Sie sie alle brauchen, verwenden Sie diese Lösung.

10voto

alpha_989 Punkte 4371

Nachdem Sie die Höchstwerte erhalten haben, versuchen Sie Folgendes:

max_val = max(list)
index_max = list.index(max_val)

Das ist viel einfacher als viele andere Optionen.

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