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

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


当前回答

假设你有一个以下列表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

其他回答

那么这个呢:

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初学者,所以我不知道这个解决方案的计算复杂性。

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