使用列表中的max()/ min()获取返回的max或min项的索引

使用列表中的max()/ min()获取返回的max或min项的索引

我在列表中使用Python maxmin函数来实现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)

我需要能够返回最小值或最大值的实际索引,而不仅仅是值。


暮色呼如
浏览 2703回答 3
3回答

白衣染霜花

if isMinLevel:     return values.index(min(values))其他:     return values.index(max(values))

蛊毒传说

假设您有一个列表values = [3,6,1,5],并且需要最小元素的索引,即index_min = 2在这种情况下。避免itemgetter()在其他答案中提出的解决方案,而是使用index_min = min(xrange(len(values)), key=values.__getitem__)因为它不需要也不需要import operator使用enumerate,并且它总是比使用的解决方案更快(下面的基准)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案例完全相同

开满天机

如果枚举列表中的项目,则可以同时找到最小/最大索引和值,但对列表的原始值执行最小值/最大值。像这样:import operatormin_index, min_value = min(enumerate(values), key=operator.itemgetter(1))max_index, max_value = max(enumerate(values), key=operator.itemgetter(1))这样,列表只会在min(或max)中遍历一次。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python