Получение индекса максимального или минимального элемента в списке с помощью max()/min()
У меня возникла проблема при использовании функций max
и min
в Python для алгоритма минимакса. Необходимо получить индекс значения, возвращаемого функциями 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)
Мне нужно, чтобы функция возвращала не только значение минимума или максимума, но и соответствующий индекс этого значения в списке. Как это можно реализовать?
5 ответ(ов)
Вы можете одновременно найти индекс и значение минимального/максимального элемента, если переберете элементы списка, но при этом выполните поиск 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))
Таким образом, список будет пройден только один раз для поиска минимального (или максимального) значения.
Для преобразования массива значений в массив пар (значение, индекс), а затем нахождения максимума или минимума, можно воспользоваться функцией enumerate
, которая возвращает пары (индекс, значение). При помощи функции max
или min
можно сравнивать пары сначала по значению, а затем по индексу, если значения равны.
Вот пример кода, который делает это:
values = [3, 5, 4, 5]
m, i = max((v, i) for i, v in enumerate(values))
print((m, i)) # (5, 3)
В приведенном примере, max
возвращает пару с максимальным значением и соответствующим ему индексом, при этом в случае нескольких одинаковых максимальных значений будет возвращён последний встреченный индекс. Таким образом, вывод (5, 3)
указывает на то, что максимальное значение 5 находится по индексу 3 в исходном массиве.
Если вам нужны все индексы минимального значения (поскольку минимум может встречаться в списке несколько раз), вы можете воспользоваться следующим кодом:
minval = min(mylist)
ind = [i for i, v in enumerate(mylist) if v == minval]
Этот код сначала находит минимальное значение в списке mylist
, используя функцию min()
. Затем с помощью генератора списка и функции enumerate()
мы создаем новый список ind
, который содержит индексы всех элементов, равных найденному минимуму.
После того как вы получите максимальные значения, попробуйте следующее:
max_val = max(список)
index_max = список.index(max_val)
Это гораздо проще, чем многие другие варианты.
В Pandas теперь есть гораздо более удобное решение. Попробуйте использовать следующий код:
df[column].idxmax()
Эта функция возвращает индекс первого максимального значения в указанном столбце DataFrame.
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Самый быстрый способ проверить наличие значения в списке
Преобразование всех строк в списке в целые числа
Нахождение среднего значения списка