- Pythonic way to find maximum value and its index in a list?
- 11 Answers 11
- Поиск максимального значения в списке на Python
- Список в Python
- №1 Нахождение максимального значения с помощью функции max()
- Поиск и печать наибольшего и наименьшего элемента в массиве в Python
- Нахождение максимального элемента
- Алгоритм
- Программа
- Поиск минимального элемента
- Алгоритм
- Программа
- Как найти максимальный элемент списка в Python
- Введение
- Метод sort()
- Метод sorted()
- Циклом for
- Функция max()
- Заключение
Pythonic way to find maximum value and its index in a list?
If I want the maximum value in a list, I can just write max(List) , but what if I also need the index of the maximum value? I can write something like this:
maximum=0 for i,value in enumerate(List): if value>maximum: maximum=value index=i
@mwc: It will iterate the list once to determine the maximum value, then iterate it a second time to find the index of that value.
11 Answers 11
I think the accepted answer is great, but why don’t you do it explicitly? I feel more people would understand your code, and that is in agreement with PEP 8:
max_value = max(my_list) max_index = my_list.index(max_value)
This method is also about three times faster than the accepted answer:
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)
Results as they run in my computer:
Explicit: 8.07 usec/pass Implicit: 22.86 usec/pass
Explicit: 6.80 usec/pass Implicit: 19.01 usec/pass
Didn’t expect it to be faster. It is faster even when I replace l with «l = [random.random() for _ in xrange(10000000)]+[2]», which guarantees that last element is the largest.
@Sunny88: For a simple list of numbers, the simple approach is faster. If you are after performance in this case, I’d suggest to use numpy.argmax() , which is another 30 times faster on my machine. If the list contains more complicated objects than mere numbers, the approach in my answer can become faster. Wnother advantage of that approach is that it can be used for arbitrary iterators, not only for lists.
@Sven-Marnach Would numpy be faster, if I had to convert my list to a numpy array first? Would it be faster for the simple example [0,1,0]?
@Sven-Marnach I just checked. numpy.argmax is by far the slowest method, and it gives the wrong answer, if the array contains strings instead of floats or integers.
There are many options, for example:
import operator index, value = max(enumerate(my_list), key=operator.itemgetter(1))
@Sunny88: The key function is only used to decide which element is maximal. The elements are not changed.
@lifebalance Using itemgetter() is faster, and avoiding an import isn’t a goal worth pursuing. Avoiding external dependencies can be worthwhile in some cases, but an import from the standard library is a non-issue.
This answer is 33 times faster than @Escualo assuming that the list is very large, and assuming that it’s already an np.array(). I had to turn down the number of test runs because the test is looking at 10000000 elements not just 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
В этой статье мы научимся находить максимальное значение в списке на Python. Для всестороннего понимания вопроса мы рассмотрим использование некоторых встроенных функций, простые подходы, а также небольшие реализации известных алгоритмов.
Сначала давайте вкратце рассмотрим, что такое список в Python и как найти в нем максимальное значение или просто наибольшее число.
Список в Python
В Python есть встроенный тип данных под названием список (list). По своей сути он сильно напоминает массив. Но в отличие от последнего данные внутри списка могут быть любого типа (необязательно одного): он может содержать целые числа, строки или значения с плавающей точкой, или даже другие списки.
Хранимые в списке данные определяются как разделенные запятыми значения, заключенные в квадратные скобки. Списки можно определять, используя любое имя переменной, а затем присваивая ей различные значения в квадратных скобках. Он является упорядоченным, изменяемым и допускает дублирование значений. Например:
list1 = ["Виктор", "Артем", "Роман"] list2 = [16, 78, 32, 67] list3 = ["яблоко", "манго", 16, "вишня", 3.4]Далее мы рассмотрим возможные варианты кода на Python, реализующего поиск наибольшего элемента в списке, состоящем из сравниваемых элементов. В наших примерах будут использоваться следующие методы/функции:
- Встроенная функция max()
- Метод грубой силы (перебора)
- Функция reduce()
- Алгоритм Heap Queue (очередь с приоритетом)
- Функция sort()
- Функция sorted()
- Метод хвостовой рекурсии
№1 Нахождение максимального значения с помощью функции max()
Это самый простой и понятный подход к поиску наибольшего элемента. Функция Python max() возвращает самый большой элемент итерабельного объекта. Ее также можно использовать для поиска максимального значения между двумя или более параметрами.
В приведенном ниже примере список передается функции max в качестве аргумента.
Поиск и печать наибольшего и наименьшего элемента в массиве в Python
В данном руководстве рассмотрим возможность поиска и печати наибольшего и наименьшего элемента в массиве Python.
Нахождение максимального элемента
Нам нужно найти самый большой элемент, присутствующий в массиве Python, и отобразить его. Этого можно добиться, перебирая массив от начала до конца, сравнивая max со всеми элементами массива. Если какой-либо из элементов больше max, сохраните значение элемента в max. Первоначально max будет содержать значение первого элемента. В конце цикла max представляет самый большой элемент в массиве.
В приведенном выше массиве изначально max будет содержать значение 25. В 1-й итерации max будет сравниваться с 11, поскольку 11 меньше max. Макс сохранит свое значение. В следующей итерации он будет сравниваться с 7, 7 также меньше, чем max, никаких изменений в max не вносится. Теперь max будет сравниваться с 75. 75 больше, чем max, поэтому max будет содержать значение 75.
Продолжайте этот процесс, пока не будет достигнут конец массива. В конце цикла max будет содержать самый большой элемент в массиве.
Алгоритм
- ШАГ 1: Объявите и инициализируйте массив.
- ШАГ 2: Сохраните первый элемент в переменной max.
- ШАГ 3: Переберите массив от 0 до длины массива и сравните значение max с элементами массива.
- ШАГ 4: Если какой-либо элемент больше max, max будет содержать значение этого элемента.
- ШАГ 5: Наконец, max будет содержать самый большой элемент в массиве.
Программа
#Initialize array arr = [25, 11, 7, 75, 56]; #Initialize max with first element of array. max = arr[0]; #Loop through the array for i in range(0, len(arr)): #Compare elements of array with max if(arr[i] > max): max = arr[i]; print("Largest element present in given array: " + str(max));
Largest element present in given array: 75
Поиск минимального элемента
Следующим действием нам нужно найти наименьший элемент, присутствующий в массиве. Этого можно добиться, поддерживая переменную min, которая изначально будет содержать значение первого элемента. Перебрать массив, сравнивая значение min с элементами массива. Если какое-либо значение элемента меньше min, сохраните значение элемента в min.
Рассмотрим выше массив. Первоначально min будет содержать значение 25. В 1-й итерации min будет сравниваться с 11. Поскольку 11 меньше 25. Min будет содержать значение 11. Во 2-й итерации 11 будет сравниваться с 7. Теперь 7 меньше 11. Итак, min примет значение 7.
Продолжайте этот процесс, пока не будет достигнут конец массива. Наконец, min будет содержать элемент с наименьшим значением в массиве.
Алгоритм
- ШАГ 1: Объявите и инициализируйте массив.
- ШАГ 2: Сохраните первый элемент в переменной min.
- ШАГ 3: Переберите массив от 0 до длины массива и сравните значение min с элементами массива.
- ШАГ 4: Если какой-либо элемент меньше min, min будет содержать значение этого элемента.
- ШАГ 5: Наконец, min будет представлять наименьший элемент в массиве.
Программа
#Initialize array arr = [25, 11, 7, 75, 56]; #Initialize min with the first element of the array. min = arr[0]; #Loop through the array for i in range(0, len(arr)): #Compare elements of array with min if(arr[i] < min): min = arr[i]; print("Smallest element present in given array: " + str(min));
Smallest element present in given array: 7
Как найти максимальный элемент списка в Python
Статьи
Введение
В данной статье рассмотрим четыре способа для поиска максимального значения в списке в Python.
Метод sort()
Как мы знаем, метод sort() сортирует упорядоченные коллекции элементов по возрастанию. Однако, если мы добавим параметр reverse, то сможем отсортировать список по убыванию. После такой сортировки максимальный элемент списка будет находиться по индексу 0:
new_list = [6, 10, 5, 2, 7] new_list.sort(reverse=True) print(f'Максимальный элемент в списке: ') # Вывод: Максимальное число в списке: 10
Метод sorted()
Данный способ работает по той же методике, что и предыдущий. Различие лишь в том, что мы будем использовать функцию sorted():
new_list = [6, 10, 5, 2, 7] new_list = sorted(new_list, reverse=True) print(f'Максимальный элемент в списке: ') # Вывод: Максимальное число в списке: 10
Циклом for
Мы можем определить максимальное число в списке при помощи цикла for. Для этого создадим переменную max_number, и сохраним в неё значение первого элемента списка:
new_list = [6, 10, 5, 2, 7] max_number = new_list[0]
Далее создадим цикл, в котором пройдёмся по всему списку new_list. Внутри цикла зададим условие, что если итерабельное значение больше max_number, то меняем значение в max_number на итерабельное:
new_list = [6, 10, 5, 2, 7] max_number = new_list[0] for i in new_list: if i > max_number: max_number = i print(f'Максимальное число в списке: ') # Вывод: Максимальный элемент в списке: 10
Функция max()
В Python существует встроенная функция, которая позволяет находить максимальное значение в списке, кортеже и т.д.
Сохраним значение максимального элемента в списке, и выведем его:
new_list = [6, 10, 5, 2, 7] max_number = max(new_list) print(f'Максимальное число в списке: ') # Вывод: Максимальное число в списке: 10
Заключение
В ходе статьи мы с Вами разобрали целых четыре способа нахождения максимального элемента в списке Python. Надеюсь Вам понравилась статья, желаю удачи и успехов! 🙂