使用列表上的max()/ min()获取返回的最大或最小项目的索引

我在清单上使用Python的maxmin函数进行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)

我须要可以返回最小值或最大值的实际索引,而不单单是返回值。 算法


#1楼

只是已经说过的一小部分。 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)多是一个更好的主意。 函数


#2楼

假设您有一个列表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列表,也将比第一个解决方案更快。

  • 它大于几个元素(个人机器上大约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))

将给您第一个最小索引。

相关文章
相关标签/搜索