我在列表上使用 Python 的max和函数来实现极小最大算法,我需要或min返回的值的索引。换句话说,我需要知道哪个动作产生了最大值(在第一个玩家的回合)或最小值(第二个玩家)。max()``min()
max
min
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)
我需要能够返回最小值或最大值的实际索引,而不仅仅是值。
要获取max()或min()函数返回的值在列表中的索引,可以使用 Python 的enumerate()函数来同时跟踪列表中的值和它们的索引,然后使用key参数在max()或min()中找到具有最小或最大值的元素。
max()
min()
enumerate()
key
你可以按照以下步骤修改你的代码,以便在返回值的同时返回其索引:
values
你可以将你的函数修改如下,以返回值和索引:
values = [] # 列表用于存储(值, 索引)元组 # 遍历可能的移动 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, i)) # 存储值和索引 # 查找最小或最大值及其索引 if is_min_level: min_value, min_index = min(values, key=lambda x: x[0]) # 获取最小值及索引 return min_value, min_index else: max_value, max_index = max(values, key=lambda x: x[0]) # 获取最大值及索引 return max_value, max_index
values.append((temp, i))
temp
i
min(values, key=lambda x: x[0])
key=lambda x: x[0]
max(values, key=lambda x: x[0])
现在,当你调用这个函数时,它将返回一个包含最小或最大值及其对应索引的元组:
value, index = min_max(current_board, 0, True) print(f"最佳移动的索引是 {index},得分是 {value}")
这个方法可以让你轻松确定在极小最大算法中产生最优值的移动。