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

新手上路,请多包涵

I’m using Python’s max and min functions on lists for a minimax algorithm, and I need the index of the value returned by max() or min() .换句话说,我需要知道哪个动作产生了最大值(轮到第一个玩家)或最小值(第二个玩家)。

 for i in range(9):
    new_board = current_board.new_board_with_move([i / 3, i % 3], player)

    if new_board:
        temp = min_max(new_board, depth + 1, not is_min_level)
        values.append(temp)

if is_min_level:
    return min(values)
else:
    return max(values)

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

原文由 Kevin Griffin 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 758
2 个回答
if is_min_level:
    return values.index(min(values))
else:
    return values.index(max(values))

原文由 too much php 发布,翻译遵循 CC BY-SA 4.0 许可协议

假设您有一个列表 values = [3,6,1,5] ,并且需要最小元素的索引,即 index_min = 2 在这种情况下。

避免使用其他答案中提供的 itemgetter() 的解决方案,而是使用

index_min = min(range(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 案例完全相同

原文由 gg349 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题