7

Получение индекса максимального или минимального элемента в списке с помощью max()/min()

43

У меня возникла проблема при использовании функций 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 ответ(ов)

3

Вы можете одновременно найти индекс и значение минимального/максимального элемента, если переберете элементы списка, но при этом выполните поиск 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))

Таким образом, список будет пройден только один раз для поиска минимального (или максимального) значения.

0

Для преобразования массива значений в массив пар (значение, индекс), а затем нахождения максимума или минимума, можно воспользоваться функцией 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 в исходном массиве.

0

Если вам нужны все индексы минимального значения (поскольку минимум может встречаться в списке несколько раз), вы можете воспользоваться следующим кодом:

minval = min(mylist)
ind = [i for i, v in enumerate(mylist) if v == minval]

Этот код сначала находит минимальное значение в списке mylist, используя функцию min(). Затем с помощью генератора списка и функции enumerate() мы создаем новый список ind, который содержит индексы всех элементов, равных найденному минимуму.

0

После того как вы получите максимальные значения, попробуйте следующее:

max_val = max(список)
index_max = список.index(max_val)

Это гораздо проще, чем многие другие варианты.

0

В Pandas теперь есть гораздо более удобное решение. Попробуйте использовать следующий код:

df[column].idxmax()

Эта функция возвращает индекс первого максимального значения в указанном столбце DataFrame.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь