我在清单上使用Python的max
和min
函数进行minimax算法,而且须要max()
或min()
返回的值的索引。 换句话说,我须要知道哪一个移动产生了最大(第一玩家回合)或最小(第二玩家)值。 python
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)
我须要可以返回最小值或最大值的实际索引,而不单单是返回值。 算法
只是已经说过的一小部分。 values.index(min(values))
彷佛返回最小的min索引。 如下是最大的索引: 数组
values.reverse() (values.index(min(values)) + len(values) - 1) % len(values) values.reverse()
若是原地反转的反作用可有可无,则能够省略最后一行。 缓存
遍历全部事件 app
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)
多是一个更好的主意。 函数
假设您有一个列表values = [3,6,1,5]
,而且须要最小元素的索引,在这种状况下,即index_min = 2
。 测试
避免使用其余答案中出现的itemgetter()
解决方案,而改用 spa
index_min = min(xrange(len(values)), key=values.__getitem__)
由于它不须要import operator
或使用enumerate
,而且它老是比使用itemgetter()
的解决方案更快(下面的基准itemgetter()
。 code
若是您正在处理numpy数组或能够负担numpy
做为依赖项,请考虑同时使用 索引
import numpy as np index_min = np.argmin(values)
即便在如下状况下将其应用于纯Python列表,也将比第一个解决方案更快。
numpy
数组的内存副本 我已经使用python 2.7在机器上运行了基准测试,用于上述两个解决方案(蓝色:纯python,第一个解决方案)(红色,numpy解决方案)以及基于itemgetter()
的标准解决方案(黑色,参考解决方案)。 与python 3.5相同的基准测试代表,这些方法与上述python 2.7状况彻底相同
若是要在数字列表中查找max的索引(彷佛是这种状况),那么建议您使用numpy:
import numpy as np ind = np.argmax(mylist)
可能更简单的解决方案是将值的数组转换为值,索引对的数组,并取其最大值/最小值。 这将给出具备最大值/最小值的最大/最小索引(即,经过首先比较第一个元素,而后比较第二个元素(若是第一个元素相同,则比较第二对元素))。 注意,实际上不须要建立数组,由于最小/最大容许生成器做为输入。
values = [3,4,5] (m,i) = max((v,i) for i,v in enumerate(values)) print (m,i) #(5, 2)
list=[1.1412, 4.3453, 5.8709, 0.1314] list.index(min(list))
将给您第一个最小索引。