小能豆

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

python

我在列表上使用 Python 的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)

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


阅读 31

收藏
2024-09-13

共1个答案

小能豆

要获取max()min()函数返回的值在列表中的索引,可以使用 Python 的enumerate()函数来同时跟踪列表中的值和它们的索引,然后使用key参数在max()min()中找到具有最小或最大值的元素。

解决方案

你可以按照以下步骤修改你的代码,以便在返回值的同时返回其索引:

  1. 使用enumerate()values列表进行包装,以便在查找最小值或最大值时跟踪索引。
  2. 使用max()min()函数的key参数来找到基于值的最大或最小元素,同时保留索引。

修改后的代码

你可以将你的函数修改如下,以返回值和索引:

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(索引)作为元组存储到values列表中,而不仅仅是存储temp
  • min(values, key=lambda x: x[0]):找到具有最小值的元组。key=lambda x: x[0]告诉min()函数基于每个元组的第一个元素(即值)进行比较。
  • max(values, key=lambda x: x[0]):同样,找到具有最大值的元组。

使用方法

现在,当你调用这个函数时,它将返回一个包含最小或最大值及其对应索引的元组:

value, index = min_max(current_board, 0, True)
print(f"最佳移动的索引是 {index},得分是 {value}")

这个方法可以让你轻松确定在极小最大算法中产生最优值的移动。

2024-09-13