我正在使用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 = [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)
这可以使用内置的enumerate()和max()函数以及max()函数的可选键参数和一个简单的lambda表达式来实现:
theList = [1, 5, 10]
maxIndex, maxValue = max(enumerate(theList), key=lambda v: v[1])
# => (2, 10)
在max()的文档中,它说key参数需要一个类似list.sort()函数中的函数。请参见如何排序。
对于min()也是一样的。顺便说一下,它返回第一个最大/最小值。
假设你有一个以下列表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
假设你有这样一个列表:
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)