Pythonic способ найти максимальное значение и его индекс в списке?

Если мне нужно максимальное значение в списке, я могу просто написать max(List) , но что, если мне также нужен индекс максимального значения?

Я могу написать что-то вроде этого:

 maximum=0 for i,value in enumerate(List): if value>maximum: maximum=value index=i 

Но мне это выглядит скучно.

И если я напишу:

 List.index(max(List)) 

Затем он будет перебирать список дважды.

Есть ли способ лучше?

6 Solutions collect form web for “Pythonic способ найти максимальное значение и его индекс в списке?”

Существует много вариантов, например:

 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.array (). Мне пришлось отказаться от количества тестовых прогонов, потому что тест рассматривает 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 
 max([(v,i) for i,v in enumerate(my_list)]) 

С встроенной библиотекой Python это довольно просто:

 a = [2, 9, -10, 5, 18, 9] max(xrange(len(a)), key = lambda x: a[x]) 
 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)] 
Python - лучший язык программирования в мире.