我正在使用Python的max和min函数对列表进行minimax算法,我需要max()或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)

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


当前回答

那么这个呢:

a=[1,55,2,36,35,34,98,0]
max_index=dict(zip(a,range(len(a))))[max(a)]

它从a中的项中创建一个字典作为键,并将它们的索引作为值,因此dict(zip(a,range(len(a))))[max(a)]返回对应于键max(a)的值,这是a中最大值的索引。我是python初学者,所以我不知道这个解决方案的计算复杂性。

其他回答

seq=[1.1412, 4.3453, 5.8709, 0.1314]
seq.index(min(seq))

会给出最小值的第一个指数。

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

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),列表将只遍历一次。

只是对刚才所说的稍加补充。 values.index(min(values))似乎返回min的最小索引。下面的语句将获得最大索引:

    values.reverse()
    (values.index(min(values)) + len(values) - 1) % len(values)
    values.reverse()

如果原地反转的副作用不重要,最后一行可以省略。

遍历所有发生的事件

    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)可能是一个更好的主意。

使用numpy模块的函数numpy.where

import numpy as n
x = n.array((3,3,4,7,4,56,65,1))

最小值指数:

idx = n.where(x==x.min())[0]

最大值指数:

idx = n.where(x==x.max())[0]

事实上,这个函数要强大得多。你可以提出各种布尔运算 数值在3至60之间的指数:

idx = n.where((x>3)&(x<60))[0]
idx
array([2, 3, 4, 5])
x[idx]
array([ 4,  7,  4, 56])

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

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

index_min = min(range(len(values)), key=values.__getitem__)

因为它不需要导入操作符,也不需要使用枚举,而且它总是比使用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情况完全相同