我在清单上使用Python的max和min函数进行minimax算法,并且需要max()或min()返回的值的索引。 换句话说,我需要知道哪个移动产生了最大(第一玩家回合)或最小(第二玩家)值。
for i in range(9):
newBoard = currentBoard.newBoardWithMove([i / 3, i % 3], player)
if newBoard:
temp = minMax(newBoard, depth + 1, not isMinLevel)
values.append(temp)
if isMinLevel:
return min(values)
else:
return max(values)
我需要能够返回最小值或最大值的实际索引,而不仅仅是返回值。
#1楼
只是已经说过的一小部分。 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)可能是一个更好的主意。
#2楼
假设您有一个列表values = [3,6,1,5] ,并且需要最小元素的索引,在这种情况下,即index_min = 2 。
避免使用其他答案中出现的itemgetter()解决方案,而改用
index_min = min(xrange(len(values)), key=values.__getitem__)
因为它不需要import operator或使用enumerate ,并且它总是比使用itemgetter()的解决方案更快(下面的基准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情况完全相同
#3楼
如果要在数字列表中查找max的索引(似乎是这种情况),那么建议您使用numpy:
import numpy as np
ind = np.argmax(mylist)
#4楼
可能更简单的解决方案是将值的数组转换为值,索引对的数组,并取其最大值/最小值。 这将给出具有最大值/最小值的最大/最小索引(即,通过首先比较第一个元素,然后比较第二个元素(如果第一个元素相同,则比较第二对元素))。 注意,实际上不需要创建数组,因为最小/最大允许生成器作为输入。
values = [3,4,5]
(m,i) = max((v,i) for i,v in enumerate(values))
print (m,i) #(5, 2)
#5楼
list=[1.1412, 4.3453, 5.8709, 0.1314]
list.index(min(list))
将给您第一个最小索引。