我正在使用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)
我需要能够返回最小值或最大值的实际索引,而不仅仅是值。
我对此也很感兴趣,并使用perfplot(我的一个爱好项目)比较了一些建议的解决方案。
事实证明
min(range(len(a)), key=a.__getitem__)
是用于小型和大型列表的最快方法。
在以前的版本中,np。阿格明过去常吃蛋糕。)
生成图的代码:
import numpy as np
import operator
import perfplot
def min_enumerate(a):
return min(enumerate(a), key=lambda x: x[1])[0]
def min_enumerate_itemgetter(a):
min_index, min_value = min(enumerate(a), key=operator.itemgetter(1))
return min_index
def getitem(a):
return min(range(len(a)), key=a.__getitem__)
def np_argmin(a):
return np.argmin(a)
b = perfplot.bench(
setup=lambda n: np.random.rand(n).tolist(),
kernels=[
min_enumerate,
min_enumerate_itemgetter,
getitem,
np_argmin,
],
n_range=[2**k for k in range(15)],
)
b.show()
只是对刚才所说的稍加补充。
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