max(iterable, *[, key, default])
max(arg1, arg2, *args[, key])
iterable
- итерируемый объект,key
- функция сортировки (смотри list.sort()
""),default
- значение по умолчанию, если итерируемый объект окажется пустым,arg1...argN
- позиционный аргумент,*args
- список позиционных аргументов.Функция max()
возвращает наибольшее значение элемента итерируемого объекта или самое большое из двух или более переданных позиционных аргументов.
sorted(iterable, key=keyfunc, reverse=True)[0]
и heapq.nlargest(1, iterable, key=keyfunc)
Аргумент key
- функция подобная той, которая используется в дополнительном методе списков list.sort()
. Функция принимает один аргумент и используется для упорядочивания элементов.
>>> x = ['4', '11', '6', '31']
# функция `max` сравнивает
# числа как строки
>>> max(x)
'6'
# функция 'key=lambda i: int(i)' применяется
# к каждому элементу списка 'x', преобразуя
# строки в тип 'int' и теперь функция `max`
# сравнивает элементы списка как числа.
>>> max(x, key=lambda i: int(i))
'31'
# или другое применение функции 'key'
# выбор списка с наибольшей суммой элементов
>>> max([1,2,3,4], [3,4,5], key=sum)
[3, 4, 5]
Аргумент default
по умолчанию указывает объект, который нужно вернуть, если предоставленный итерируемый объект пуст. Если итерация пуста и значение по умолчанию не указано, то возникает ошибка ValueError
.
# Значение по умолчанию
>>> max([], default=10)
10
Функция max()
сравнивает элементы, используя оператор <
. Поэтому, все передаваемые в них значения должны быть сопоставимы друг с другом и одного типа, иначе бросается исключение TypeError
При передаче в качестве аргумента текстовых строк, байтовых строк или байтовых массивов, а так же списка символов, максимальное значение будет выбираться исходя из порядка следования символов, в таблице соответствующей кодировки.
>>> x = list('abcdifgh')
>>> max(x)
# 'i'
Изменено в Python 3.8: Аргумент key
может быть None
.
# использование позиционных аргументов
>>> max(5, 3, 6, 5, 6)
# 6
# использование в качестве аргумента - список
>>> max([1.2, 1.3, 1.5, 2, 5.52])
# 5.52
# комбинирование позиционных аргументов и списка
# при передаче списка 'x' происходит его распаковка
>>> x = (1.2, 1.3, 1.5, 2, 5.52)
>>> max(5, 3, 5, *x)
# 5,52
Найдем самую длинную строку. В качестве ключевой функции используем len()
. Она посчитает количество символов в строке каждого элемента списка строк, а функция max()
выберет максимальное число. Строки можно передать например как позиционные аргументы, так и списком ['Jul', 'John', 'Vicky']
, результат будет тот же.
>>> line = ['Jul', 'John', 'Vicky']
>>> max(line, key=len)
# 'Vicky'
max()
в списке строк, записанных как целые числа.Есть список строк чисел и необходимо найти максимум, как если бы они были целыми числами? Если применить функцию max()
к исходному списку "как есть", то она выберет наибольшее значение списка исходя из лексикографической сортировки. Для нахождения максимума, как числа, применим функцию lambda i: int(i)
в качестве ключа key
, которая "на лету" преобразует элементы списка в целые числа, тогда функция max()
выберет то что нам нужно.
>>> x = ['4', '11', '6', '31']
>>> max(x)
# '6'
>>> max(x, key = lambda i: int(i))
# '31'
max()
в строке, которая состоит из чисел и строк.Что бы найти максимум в строке, которая состоит из чисел и строк, необходимо сначала разделить исходную строку на список подстрок. Используем приемы, описанные в примерах функции sum()
:
' '
или ';'
методом строки str.split()
,re.findall()
.Затем в цикле перебрать полученный список и все строки с цифрами преобразовать в соответствующие числовые типы и уже потом применить функцию
# исходная строка
>>> line = '12; 12,5; 14; один; 15.6; два'
# способы преобразования строки в список строк
# 1 способ по разделителю ';'
>>> line.split(';')
# ['12', ' 12,5', ' 14', ' один', ' 15.6', ' два']
# 2 способ по регулярному выражению
>>> import re
>>> match = re.findall(r'[\d\.?,?]+', line)
>>> list(match)
# ['12', '12,5', '14', '15.6']
Далее будем работать с более сложным списком, полученным 1 способом, где встречаются слова. И так, имеем список строк с цифрами и другими строками. Стоит задача: преобразовать строки с цифрами в соответствующие числовые типы и отбросить строки со словами, что бы потом найти максимум.
Задача усложняется тем, что вещественные числа в строках записаны как через запятую, так и через точку. Для необходимых проверок и преобразований определим функцию str_to_num()
.
>>> def str_to_num(str, chars=['.', ',']):
... # убираем начальные и конечные пробелы
... str = str.strip()
... if (any(char in str for char in chars) and
... str.replace('.', '').replace(',', '').isdigit()):
... # если в строке есть точка или запятая и при их замене на ''
... # строка состоит только из цифр то это тип float
... return float(str.replace(',', '.'))
... elif str.isdigit():
... # если строка состоит только из цифр то это тип int
... return int(str)
# полученный список строк 1-м способом
>>> str_list = ['12', ' 12,5', ' 14', ' один', ' 15.6', ' два']
# новый список чисел, где будем искать максимум
>>> num_list = []
>>> for i in str_list:
... # применим функцию преобразования строки в число
... n = str_to_num(i)
... if n is not None:
... # если функция возвращает число,
... # то добавляем в новый список
... num_list.append(str_to_num(i))
>>> num_list
# [12, 12.5, 14, 15.6]
>>> max(num_list)
# 15.6
Допустим есть список чисел и стоит задача, определить индекс максимального значения в этом списке. Для решения этой задачи необходимо пронумеровать список, т.е. создать кортеж - индекс/число, а затем найти максимум, используя в качестве ключа key=lambda i : i[1]
.
>>> lst = [1, 5, 3, 6, 9, 7]
# пронумеруем список
>>> lst_num = list(enumerate(lst, 0))
>>> lst_num
# [(0, 1), (1, 5), (2, 3), (3, 6), (4, 9), (5, 7)]
# найдем максимум (из второго значения кортежей)
>>> t_max = max(lst_num, key=lambda i : i[1])
>>> t_max
# (4, 9)
# индекс максимального значения
>>> t_max[0]
# 4
max()
для ключа или значения в словаре dict
.Допустим есть словарь, задача: найти максимальное значение ключа или самого значения ключа и вывести эту пару.
# имеем словарь
>>> d = {1: 3, 2: 4, 1: 9, 4: 1}
# преобразуем его в список отображение
>>> key_val = d.items()
# преобразуем отображение в список
# кортежей (ключ, значение)
>>> key_val_list = list(key_val)
# [(1, 9), (2, 4), (4, 1)]
По умолчанию, при нахождении максимального элемента из списка кортежей будет выбираться кортеж, у которого наибольшее значение имеет ключ исходного словаря (первый элемент в кортеже).
Но если необходимо получить пару (key, value)
, у которого наибольшее значение имеет значение ключа (второй элемент), то для этого нужно применить лямбда-функцию lambda i : i[1]
в качестве аргумента key
функции max()
, которая укажет, из какого элемента кортежа выбирать наибольшее значение.
# происходит сравнение по
# первым элементам кортежа
>>> kv = max(key_val_list)
>>> kv
# (4, 1)
# максимальное значение ключа в словаре
>>> kv[0]
# 4
# меняем порядок сравнения
>>> kv = max(key_val_list, key=lambda i : i[1])
>>> kv
# (1, 9)
# максимальное значение в словаре
>>> kv[1]
# 9
# ключ этого значения в словаре
>>> kv[0]
# 1
# получаем максимальное значение из словаря
>>> d[kv[0]]
# 9
Для выполнения данной задачи, используем функцию max()
, а в качестве ключевой функции применим встроенную функцию sum()
.
# исходный список
>>> lst = [[1, 2, 3], [4, 5], [1, 3, 4, 5], [10, 20]]
# выбираем список с наибольшей суммой элементов
>>> max(lst, key=sum)
# [10, 20]
Для выполнения данной задачи, используем функцию max()
, а в качестве ключевой функции применим встроенную функцию len()
.
# исходный список
>>> lst = [[1, 2, 3], [4, 5], [1, 3, 4, 5], [10, 20]]
# выбираем список с наибольшим количеством элементов
>>> max(lst, key=len)
# [1, 3, 4, 5]