我正在使用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)

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


当前回答

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

其他回答

假设你有这样一个列表:

a = [9,8,7]

下面的两个方法是非常紧凑的方法,可以获得具有最小元素及其索引的元组。两者都需要差不多的时间来处理。我更喜欢压缩法,但那是我的口味。

邮政法

element, index = min(list(zip(a, range(len(a)))))

min(list(zip(a, range(len(a)))))
(7, 2)

timeit min(list(zip(a, range(len(a)))))
1.36 µs ± 107 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

列举的方法

index, element = min(list(enumerate(a)), key=lambda x:x[1])

min(list(enumerate(a)), key=lambda x:x[1])
(2, 7)

timeit min(list(enumerate(a)), key=lambda x:x[1])
1.45 µs ± 78.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

只要你知道如何使用lambda和"key"参数,一个简单的解决方案是:

max_index = max( range( len(my_list) ), key = lambda index : my_list[ index ] )

如果你想在一个数字列表中找到max的下标(这似乎是你的情况),那么我建议你使用numpy:

import numpy as np
ind = np.argmax(mylist)

假设你有一个以下列表my_list =[1,2,3,4,5,6,7,8,9,10],我们知道如果我们执行max(my_list),它将返回10,而min(my_list)将返回1。现在,我们想要获得最大或最小元素的索引,我们可以执行以下操作。

My_list = [1,2,3,4,5,6,7,8,9,10] Max_value = max(my_list) #返回10 my_list.index(max_value) #返回9 #获取最小值的索引 Min_value = min(my_list) #返回1 min_value = my_list.index(min_value) #返回0

我对此也很感兴趣,并使用perfplot(我的一个爱好项目)比较了一些建议的解决方案。

事实证明

min(range(len(a)), key=a.__getitem__)

是用于小型和大型列表的最快方法。

在以前的版本中,np。阿格明过去常吃蛋糕。)


生成图的代码:

import numpy as np
import operator
import perfplot


def min_enumerate(a):
    return min(enumerate(a), key=lambda x: x[1])[0]


def min_enumerate_itemgetter(a):
    min_index, min_value = min(enumerate(a), key=operator.itemgetter(1))
    return min_index


def getitem(a):
    return min(range(len(a)), key=a.__getitem__)


def np_argmin(a):
    return np.argmin(a)


b = perfplot.bench(
    setup=lambda n: np.random.rand(n).tolist(),
    kernels=[
        min_enumerate,
        min_enumerate_itemgetter,
        getitem,
        np_argmin,
    ],
    n_range=[2**k for k in range(15)],
)
b.show()