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

其他回答

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

df(列).idxmax ()

那么这个呢:

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

为什么要先添加索引,然后反转它们呢?Enumerate()函数只是zip()函数用法的一个特例。让我们以适当的方式来使用它:

my_indexed_list = zip(my_list, range(len(my_list)))

min_value, min_index = min(my_indexed_list)
max_value, max_index = max(my_indexed_list)

使用numpy模块的函数numpy.where

import numpy as n
x = n.array((3,3,4,7,4,56,65,1))

最小值指数:

idx = n.where(x==x.min())[0]

最大值指数:

idx = n.where(x==x.max())[0]

事实上,这个函数要强大得多。你可以提出各种布尔运算 数值在3至60之间的指数:

idx = n.where((x>3)&(x<60))[0]
idx
array([2, 3, 4, 5])
x[idx]
array([ 4,  7,  4, 56])

只要你知道如何使用lambda和"key"参数,一个简单的解决方案是:

max_index = max( range( len(my_list) ), key = lambda index : my_list[ index ] )