Получение индекса возвращенного элемента 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 ]

6 голосов
/ 05 января 2019

Я думаю, что лучше всего преобразовать список в numpy array и использовать эту функцию:

a = np.array(list)
idx = np.argmax(a)
5 голосов
/ 14 апреля 2011

Я думаю, что ответ выше решает вашу проблему, но я подумал, что поделюсь методом, который дает вам минимум и все индексы, в которых появляется минимум.

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

Это проходит список дважды, но все еще довольно быстро. Это, однако, немного медленнее, чем нахождение индекса первого столкновения минимума. Поэтому, если вам нужен только один из минимумов, используйте решение Мэтта Андерсона , если вам нужны все, используйте это.

4 голосов
/ 26 февраля 2018

Скажем, у вас есть список, такой как:

a = [9,8,7]

Следующие два метода являются довольно компактными способами получить кортеж с минимальным элементом и его индексом. Обе обрабатываются схожими . Мне больше нравится метод zip, но это мой вкус.

почтовый метод

element, index = min(list(zip(a, range(len(a)))))

min(list(zip(a, range(len(a)))))
(7, 2)

timeit min(list(zip(a, range(len(a)))))
1.36 µs ± 107 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

метод перечисления

index, element = min(list(enumerate(a)), key=lambda x:x[1])

min(list(enumerate(a)), key=lambda x:x[1])
(2, 7)

timeit min(list(enumerate(a)), key=lambda x:x[1])
1.45 µs ± 78.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
4 голосов
/ 25 января 2017

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

max_index = max( range( len(my_list) ), key = lambda index : my_list[ index ] )
4 голосов
/ 28 октября 2016

Это просто возможно с помощью встроенной функции enumerate() и max() и необязательного аргумента key функции max() и простого лямбда-выражения:

theList = [1, 5, 10]
maxIndex, maxValue = max(enumerate(theList), key=lambda v: v[1])
# => (2, 10)

В документах для max() говорится, что аргумент key ожидает функцию, аналогичную функции list.sort(). Также см. Сортировка Как .

То же самое работает для min(). Кстати, он возвращает первое максимальное / минимальное значение.

3 голосов
/ 17 марта 2015

Зачем сначала добавлять индексы, а затем менять их? Функция enumerate () - это особый случай использования функции zip (). Давайте использовать его соответствующим образом:

my_indexed_list = zip(my_list, range(len(my_list)))

min_value, min_index = min(my_indexed_list)
max_value, max_index = max(my_indexed_list)
2 голосов
/ 06 апреля 2012

Просто незначительное дополнение к тому, что уже было сказано. values.index(min(values)), кажется, возвращает наименьший индекс мин. Следующее получает самый большой индекс:

    values.reverse()
    (values.index(min(values)) + len(values) - 1) % len(values)
    values.reverse()

Последняя строка может быть пропущена, если побочный эффект реверса на месте не имеет значения.

Для перебора всех вхождений

    indices = []
    i = -1
    for _ in range(values.count(min(values))):
      i = values[i + 1:].index(min(values)) + i + 1
      indices.append(i)

Ради краткости. Вероятно, лучше кэшировать min(values), values.count(min) вне цикла.

2 голосов
/ 09 августа 2016

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

min_value = min(values)
indexes_with_min_value = [i for i in range(0,len(values)) if values[i] == min_value]

Затем выберите, например, первый:

choosen = indexes_with_min_value[0]
1 голос
/ 19 февраля 2018

Не хватает представителя, чтобы прокомментировать существующий ответ.

Но за https://stackoverflow.com/a/11825864/3920439 ответ

Это работает для целых чисел, но не работает для массива с плавающей точкой (по крайней мере в Python 3.6) Это повысит TypeError: list indices must be integers or slices, not float

1 голос
/ 12 марта 2017

Просто так:

stuff = [2, 4, 8, 15, 11]

index = stuff.index(max(stuff))
...