Я использую 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)
Мне нужно иметь возможность возвращать фактический индекс минимального или максимального значения, а не только значение.
divmod
существует, чтобы не сказать[i / 3, i % 3]
много.Ответы:
источник
tmp = min(values); return values.index(tmp)
Скажите, что у вас есть список
values = [3,6,1,5]
, и вам нужен индекс наименьшего элемента, т.е.index_min = 2
в этом случае.Избегайте решения,
itemgetter()
представленного в других ответах, и используйте вместопотому что он не требует
import operator
ни использоватьenumerate
, и он всегда быстрее (тест ниже), чем решение, использующееitemgetter()
.Если вы имеете дело с массивами NumPy или можете позволить себе
numpy
как зависимость, подумайте также об использованииЭто будет быстрее, чем первое решение, даже если вы примените его к чистому списку Python, если:
numpy
массивкак показывает этот тест:
Я запустил бенчмарк на моей машине с python 2.7 для двух вышеупомянутых решений (синий: чистый питон, первое решение) (красный, пустое решение) и для стандартного решения на основе
itemgetter()
(черный, эталонное решение). Тот же самый тест с python 3.5 показал, что методы сравнивают точно так же, как и в случае с Python 2.7, представленным выше.источник
xrange()
устарела, вы можете использоватьrange()
import numpy as np; x = [2.3, -1.4]; np.argmin(x)
. Вы увидите, что этоargmin
работает и на поплавкахВы можете найти мин / макс индекс и значение одновременно, если вы перечисляете элементы в списке, но выполняете мин / макс для исходных значений списка. Вот так:
Таким образом, список будет проходиться только один раз за мин (или макс).
источник
key=lambda p: p[1]
Если вы хотите найти индекс max в списке чисел (что кажется вашим случаем), то я предлагаю вам использовать numpy:
источник
Возможно, более простое решение состояло бы в том, чтобы превратить массив значений в массив значений, индексные пары и взять максимум / мин этого. Это дало бы наибольший / наименьший индекс, который имеет максимум / мин (т.е. пары сравниваются, сначала сравнивая первый элемент, а затем сравнивая второй элемент, если первые совпадают). Обратите внимание, что на самом деле не нужно создавать массив, потому что min / max разрешают генераторы в качестве входных данных.
источник
Даст вам первый индекс минимума.
источник
Я думаю, что лучше всего преобразовать список в a
numpy array
и использовать эту функцию:источник
Я также был заинтересован в этом и сравнил некоторые из предложенных решений с использованием perfplot ( любимый проект).
Оказывается, аргмин этого numpy ,
это самый быстрый метод для достаточно больших списков, даже с неявным преобразованием из ввода
list
вnumpy.array
.Код для генерации сюжета:
источник
Используйте массив numpy и функцию argmax ()
источник
После того, как вы получите максимальные значения, попробуйте это:
Гораздо проще, чем много вариантов.
источник
Я думаю, что ответ выше решает вашу проблему, но я подумал, что поделюсь методом, который дает вам минимум и все показатели, в которых этот минимум появляется.
Это проходит список дважды, но все еще довольно быстро. Однако это немного медленнее, чем нахождение индекса первого столкновения минимума. Так что если вам нужен только один из минимумов, используйте решение Мэтта Андерсона , если вам нужны все, используйте это.
источник
Используйте функцию numpy модуля numpy.where
Для индекса минимального значения:
Для индекса максимального значения:
На самом деле эта функция намного мощнее. Вы можете задать все виды логических операций. Для индекса значения от 3 до 60:
источник
argmin()
вместо того, что вы сделали здесь.Это просто возможно, используя встроенную функцию
enumerate()
иmax()
функцию и необязательныйkey
аргументmax()
функции и простое лямбда-выражение:В документации
max()
сказано, чтоkey
аргумент ожидает функцию, подобнуюlist.sort()
функции. Также см. Сортировка Как .Это работает так же для
min()
. Кстати, он возвращает первое максимальное / минимальное значение.источник
Скажем, у вас есть список, такой как:
Следующие два метода - довольно компактные способы получить кортеж с минимальным элементом и его индексом. Оба требуют одинакового времени для обработки. Мне больше нравится метод zip, но это мой вкус.
почтовый метод
метод перечисления
источник
Пока вы знаете, как использовать лямбду и аргумент «ключ», простое решение:
источник
n
он может быть заметно медленнее.Просто как тот :
источник
Зачем сначала добавлять индексы, а потом наоборот? Функция enumerate () - это особый случай использования функции zip (). Давайте использовать его соответствующим образом:
источник
Просто незначительное дополнение к тому, что уже было сказано.
values.index(min(values))
кажется, возвращает наименьший индекс мин. Следующее получает самый большой индекс:Последняя строка может быть пропущена, если не имеет значения побочный эффект реверса на месте.
Перебирать все вхождения
Ради краткости. Вероятно, это лучшая идея для кэширования
min(values), values.count(min)
вне цикла.источник
reversed(…)
вместо этого….reverse()
, вероятно, предпочтительнее, поскольку он не мутирует и все равно возвращает генератор. И все случаи могут также бытьminv = min(values); indices = [i for i, v in enumerate(values) if v == minv]
Простой способ поиска индексов с минимальным значением в списке, если вы не хотите импортировать дополнительные модули:
Затем выберите, например, первый:
источник
У вас недостаточно высокой репутации, чтобы прокомментировать существующий ответ.
Но для https://stackoverflow.com/a/11825864/3920439 ответ
Это работает для целых чисел, но не работает для массива с плавающей точкой (по крайней мере, в Python 3.6).
TypeError: list indices must be integers or slices, not float
источник
https://docs.python.org/3/library/functions.html#max
Если несколько элементов максимальны, функция возвращает первый встреченный элемент. Это согласуется с другими инструментами сохранения стабильности сортировки, такими как
sorted(iterable, key=keyfunc, reverse=True)[0]
Чтобы получить больше, чем просто первый, используйте метод сортировки.
источник
Что насчет этого:
Он создает словарь из элементов в
a
качестве ключей и их индексов в качестве значений, таким образомdict(zip(a,range(len(a))))[max(a)]
возвращает значение, соответствующее ключу,max(a)
который является индексом максимума в a. Я новичок в Python, поэтому я не знаю о вычислительной сложности этого решения.источник