Подходящие для Python способ найти максимальное значение и его индекс в списке?
Если я хочу максимальное значение в списке, я могу просто написать max(List), но что, если мне также нужен индекс максимального значения?
Я могу написать что-то вроде этого:
maximum=0
for i,value in enumerate(List):
if value>maximum:
maximum=value
index=i
но мне это кажется скучным.
а если я напишу:
List.index(max(List))
затем он будет повторять список дважды.
есть ли лучший способ?
9 ответов:
есть много вариантов, например:
import operator index, value = max(enumerate(my_list), key=operator.itemgetter(1))
Я думаю, что принятый ответ-это здорово, но почему бы вам не сделать это прямо? Я чувствую, что больше людей поймут ваш код, и это согласуется с PEP 8:
max_value = max(my_list) max_index = my_list.index(max_value)этот метод также примерно в три раза быстрее, чем принятый ответ:
import random from datetime import datetime import operator def explicit(l): max_val = max(l) max_idx = l.index(max_val) return max_idx, max_val def implicit(l): max_idx, max_val = max(enumerate(l), key=operator.itemgetter(1)) return max_idx, max_val if __name__ == "__main__": from timeit import Timer t = Timer("explicit(l)", "from __main__ import explicit, implicit; " "import random; import operator;" "l = [random.random() for _ in xrange(100)]") print "Explicit: %.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000) t = Timer("implicit(l)", "from __main__ import explicit, implicit; " "import random; import operator;" "l = [random.random() for _ in xrange(100)]") print "Implicit: %.2f usec/pass" % (1000000 * t.timeit(number=100000)/100000)результаты, как они работают на моем компьютере:
Explicit: 8.07 usec/pass Implicit: 22.86 usec/passдругое комплект:
Explicit: 6.80 usec/pass Implicit: 19.01 usec/pass
этот ответ в 33 раза быстрее, чем @Escualo, предполагая, что список очень большой, и предполагая, что это уже np.матрица.)( Мне пришлось отказаться от количества тестовых запусков, потому что тест смотрит на 10000000 элементов, а не только на 100.
import random from datetime import datetime import operator import numpy as np def explicit(l): max_val = max(l) max_idx = l.index(max_val) return max_idx, max_val def implicit(l): max_idx, max_val = max(enumerate(l), key=operator.itemgetter(1)) return max_idx, max_val def npmax(l): max_idx = np.argmax(l) max_val = l[max_idx] return (max_idx, max_val) if __name__ == "__main__": from timeit import Timer t = Timer("npmax(l)", "from __main__ import explicit, implicit, npmax; " "import random; import operator; import numpy as np;" "l = np.array([random.random() for _ in xrange(10000000)])") print "Npmax: %.2f msec/pass" % (1000 * t.timeit(number=10)/10 ) t = Timer("explicit(l)", "from __main__ import explicit, implicit; " "import random; import operator;" "l = [random.random() for _ in xrange(10000000)]") print "Explicit: %.2f msec/pass" % (1000 * t.timeit(number=10)/10 ) t = Timer("implicit(l)", "from __main__ import explicit, implicit; " "import random; import operator;" "l = [random.random() for _ in xrange(10000000)]") print "Implicit: %.2f msec/pass" % (1000 * t.timeit(number=10)/10 )результаты на моем компьютере:
Npmax: 8.78 msec/pass Explicit: 290.01 msec/pass Implicit: 790.27 msec/pass
С Python в встроенной библиотеке это довольно легко:
a = [2, 9, -10, 5, 18, 9] max(xrange(len(a)), key = lambda x: a[x])
Я бы предложил очень простой способ:
import numpy as np l = [10, 22, 8, 8, 11] print(np.argmax(l)) print(np.argmin(l))надеюсь, что это помогает.
max([(value,index) for index,value in enumerate(your_list)]) #if maximum value is present more than once in your list then this will return index of the last occurrenceЕсли максимальное значение в настоящее время более одного раза, и вы хотите получить все индексы,
max_value = max(your_list) maxIndexList = [index for index,value in enumerate(your_list) if value==max(your_list)]
может быть, вам все равно нужен сортированный список?
попробуйте это:
your_list = [13, 352, 2553, 0.5, 89, 0.4] sorted_list = sorted(your_list) index_of_higher_value = your_list.index(sorted_list[-1])
вот полное решение вашего вопроса с помощью встроенных функций Python:
# Create the List numbers = input("Enter the elements of the list. Separate each value with a comma. Do not put a comma at the end.\n").split(",") # Convert the elements in the list (treated as strings) to integers numberL = [int(element) for element in numbers] # Loop through the list with a for-loop for elements in numberL: maxEle = max(numberL) indexMax = numberL.index(maxEle) print(maxEle) print(indexMax)
Comments