我正在使用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)

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


当前回答

可能更简单的解决方案是将值数组转换为值、索引对数组,并取其中的最大/最小值。这将给出具有max/min的最大/最小索引(即对的比较首先比较第一个元素,然后比较第二个元素,如果第一个元素相同)。注意,没有必要实际创建数组,因为min/max允许生成器作为输入。

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

其他回答

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

熊猫现在有一个更温和的解决方案,试试吧:

df(列).idxmax ()

如果枚举列表中的项目,可以同时找到min/max索引和值,但对列表的原始值执行min/max。像这样:

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

这样,对于min(或max),列表将只遍历一次。

就这么简单:

stuff = [2, 4, 8, 15, 11]

index = stuff.index(max(stuff))

如果你想在一个数字列表中找到max的下标(这似乎是你的情况),那么我建议你使用numpy:

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