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

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


当前回答

只是对刚才所说的稍加补充。 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)可能是一个更好的主意。

其他回答

假设你有一个以下列表my_list =[1,2,3,4,5,6,7,8,9,10],我们知道如果我们执行max(my_list),它将返回10,而min(my_list)将返回1。现在,我们想要获得最大或最小元素的索引,我们可以执行以下操作。

My_list = [1,2,3,4,5,6,7,8,9,10] Max_value = max(my_list) #返回10 my_list.index(max_value) #返回9 #获取最小值的索引 Min_value = min(my_list) #返回1 min_value = my_list.index(min_value) #返回0

如果枚举列表中的项目,可以同时找到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))

我认为上面的答案解决了你的问题,但我想我要分享一个方法,给你最小值和最小值出现的所有指标。

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

它两次通过列表,但仍然相当快。然而,它比找到第一次遇到最小值的指数略慢。如果你只需要其中一个极小值,就用马特·安德森的解,如果你需要所有的,就用这个。

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

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

比一大堆选项简单多了。