我正在使用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_val = max(list)
index_max = list.index(max_val)

比一大堆选项简单多了。

其他回答

这可以使用内置的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()也是一样的。顺便说一下,它返回第一个最大/最小值。

如果枚举列表中的项目,可以同时找到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),列表将只遍历一次。

那么这个呢:

a=[1,55,2,36,35,34,98,0]
max_index=dict(zip(a,range(len(a))))[max(a)]

它从a中的项中创建一个字典作为键,并将它们的索引作为值,因此dict(zip(a,range(len(a))))[max(a)]返回对应于键max(a)的值,这是a中最大值的索引。我是python初学者,所以我不知道这个解决方案的计算复杂性。

我认为最好的方法是将列表转换为numpy数组并使用这个函数:

a = np.array(list)
idx = np.argmax(a)
if is_min_level:
    return values.index(min(values))
else:
    return values.index(max(values))