我正在使用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
假设您有一个列表values =[3,6,1,5],并且需要最小元素的索引,即在本例中index_min = 2。
避免使用其他答案中给出的itemgetter()的解决方案,而是使用
index_min = min(range(len(values)), key=values.__getitem__)
因为它不需要导入操作符,也不需要使用枚举,而且它总是比使用itemgetter()的解决方案更快(下面的基准测试)。
如果您正在处理numpy数组,或者可以负担numpy作为依赖项,也可以考虑使用
import numpy as np
index_min = np.argmin(values)
这将比第一个解决方案更快,即使你将它应用于一个纯Python列表,如果:
它比一些元素大(在我的机器上大约2**4个元素)
您可以将内存从纯列表复制到numpy数组
正如这一基准所指出的:
我已经用python 2.7在我的机器上运行了上面两个解决方案(蓝色:纯python,第一个解决方案)(红色,numpy解决方案)和基于itemgetter()的标准解决方案(黑色,参考解决方案)的基准测试。
python 3.5的相同基准测试表明,这些方法与上面给出的python 2.7情况完全相同
那么这个呢:
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初学者,所以我不知道这个解决方案的计算复杂性。