Получение индекса возвращенного элемента max или min с использованием max () / min () в списке - PullRequest
356 голосов
/ 19 марта 2010

Я использую функции Python max и min в списках для минимаксного алгоритма, и мне нужен индекс значения, возвращаемого max() или min(). Другими словами, мне нужно знать, какой ход дал максимальное (на ход первого игрока) или минимальное (второй игрок) значение.

for i in range(9):
    newBoard = currentBoard.newBoardWithMove([i / 3, i % 3], player)

    if newBoard:
        temp = minMax(newBoard, depth + 1, not isMinLevel)  
        values.append(temp)

if isMinLevel:
    return min(values)
else:
    return max(values)

Мне нужно иметь возможность возвращать фактический индекс минимального или максимального значения, а не только значение.

Ответы [ 21 ]

0 голосов
/ 17 сентября 2015

https://docs.python.org/3/library/functions.html#max

Если максимальное количество элементов максимально, функция возвращает первый найденный элемент. Это согласуется с другими инструментами сохранения стабильности сортировки, такими как sorted(iterable, key=keyfunc, reverse=True)[0]

Чтобы получить больше, чем просто первый, используйте метод сортировки.

import operator

x = [2, 5, 7, 4, 8, 2, 6, 1, 7, 1, 8, 3, 4, 9, 3, 6, 5, 0, 9, 0]

min = False
max = True

min_val_index = sorted( list(zip(x, range(len(x)))), key = operator.itemgetter(0), reverse = min )

max_val_index = sorted( list(zip(x, range(len(x)))), key = operator.itemgetter(0), reverse = max )


min_val_index[0]
>(0, 17)

max_val_index[0]
>(9, 13)

import ittertools

max_val = max_val_index[0][0]

maxes = [n for n in itertools.takewhile(lambda x: x[0] == max_val, max_val_index)]
...