为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2019-08-09 15:38:59
使用列表中的max()/ min()获取返回的max或min项的索引我在列表中使用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)我需要能够返回最小值或最大值的实际索引,而不仅仅是值。
查看完整描述

3 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

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


查看完整回答
反对 回复 2019-08-09
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

假设您有一个列表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案例完全相同


查看完整回答
反对 回复 2019-08-09
?
开满天机

TA贡献1786条经验 获得超12个赞

如果枚举列表中的项目,则可以同时找到最小/最大索引和值,但对列表的原始值执行最小值/最大值。像这样:


import operator

min_index, min_value = min(enumerate(values), key=operator.itemgetter(1))

max_index, max_value = max(enumerate(values), key=operator.itemgetter(1))

这样,列表只会在min(或max)中遍历一次。


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 2695 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信