我正在使用Python的max和min函数对列表进行minimax算法,我需要max()或min()返回值的索引。换句话说,我需要知道哪一步棋产生了最大(第一个玩家的回合)或最小(第二个玩家的回合)值。

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)

我需要能够返回最小值或最大值的实际索引,而不仅仅是值。


当前回答

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

其他回答

https://docs.python.org/3/library/functions.html#max

如果有多个最大项,则函数返回遇到的第一个项。这与其他保持排序稳定性的工具是一致的,例如sorted(iterable, key=keyfunc, reverse=True)[0]

要获得比第一次遇到的更多信息,请使用sort方法。

import operator

x = [2, 5, 7, 4, 8, 2, 6, 1, 7, 1, 8, 3, 4, 9, 3, 6, 5, 0, 9, 0]

min = False
max = True

min_val_index = sorted( list(zip(x, range(len(x)))), key = operator.itemgetter(0), reverse = min )

max_val_index = sorted( list(zip(x, range(len(x)))), key = operator.itemgetter(0), reverse = max )


min_val_index[0]
>(0, 17)

max_val_index[0]
>(9, 13)

import ittertools

max_val = max_val_index[0][0]

maxes = [n for n in itertools.takewhile(lambda x: x[0] == max_val, max_val_index)]
seq=[1.1412, 4.3453, 5.8709, 0.1314]
seq.index(min(seq))

会给出最小值的第一个指数。

只是对刚才所说的稍加补充。 values.index(min(values))似乎返回min的最小索引。下面的语句将获得最大索引:

    values.reverse()
    (values.index(min(values)) + len(values) - 1) % len(values)
    values.reverse()

如果原地反转的副作用不重要,最后一行可以省略。

遍历所有发生的事件

    indices = []
    i = -1
    for _ in range(values.count(min(values))):
      i = values[i + 1:].index(min(values)) + i + 1
      indices.append(i)

为了简洁起见。在循环之外缓存min(values)和values.count(min)可能是一个更好的主意。

这可以使用内置的enumerate()和max()函数以及max()函数的可选键参数和一个简单的lambda表达式来实现:

theList = [1, 5, 10]
maxIndex, maxValue = max(enumerate(theList), key=lambda v: v[1])
# => (2, 10)

在max()的文档中,它说key参数需要一个类似list.sort()函数中的函数。请参见如何排序。

对于min()也是一样的。顺便说一下,它返回第一个最大/最小值。

在你得到最大值后,试试这个:

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

比一大堆选项简单多了。