Você pode estar achando estranho um post apenas para o max. Isto porque o uso
mais comum é simplesmente achar o número mais alto em um conjunto de números.
Por exemplo:
lista_1_ate_5 = [2, 1, 4, 5, 3]
max(lista_1_ate_5)
5
Mas há outros que veremos no decorrer deste artigo.
Mais de um iterável #
A função pode receber mais de um iterável. Por exemplo, duas listas:
lista_1_ate_5 = [2, 1, 4, 5, 3]
lista_1_ate_3 = [2, 3, 1]
max(lista_1_ate_3, lista_1_ate_5)
[2, 3, 1]
Consegue entender o resultado? A função compara item a item as duas listas. O primeiro item é igual nas duas listas. O segundo item é distinto, então foi retornada a lista com o maior segundo item.
Parâmetro key #
O real poder da função max é o parâmetro key. Tal parâmetro pode receber uma
função que altera a condição do que será considerado máximo.
Usando a função len para retornar a lista mais longa:
max(lista_1_ate_3, lista_1_ate_5, key=len)
[2, 1, 4, 5, 3]
Usando a função sum para retornar a lista com maior soma de seus itens:
max(lista_1_ate_3, lista_1_ate_5, key=sum)
[2, 1, 4, 5, 3]
E se houver itens repetidos? Usando a função max padrão, será retornado o
maior valor, como esperado:
lista_repetidos = [1, 1, 2, 3, 4, 5, 6, 6, 2, 2]
max(lista_repetidos)
6
Mas, podemos usar métodos como count de uma lista, cuja função é retornar a
contagem de cada item da lista. Será retornado o número que aparece mais vezes
na lista:
max(lista_repetidos, key=lista_repetidos.count)
2
Combinando com itertools e operator #
Mas e se efetivamente você quiser o maior valor entre as duas listas que
criamos? Você pode uní-las e pedir o valor máximo da junção. Podemos usar a
função chain do itertools, que faz parte de uma instalação padrão do Python:
from itertools import chain
max(chain(lista_1_ate_3, lista_1_ate_5))
5
Já vimos que quando há mais de um iterável, o padrão é retornar o que apresenta maior valor do primeiro item. Se todos iguais, o maior valor do segundo item e assim sucessivamente:
lista_tuplas = [(1, 2, 3), (3, 1, 1), (8, 3, 3), (3, 4, 2)]
max(lista_tuplas)
(8, 3, 3)
Mas e se quisermos já partir do maior valor do segundo item? Ou do terceiro?
Podemos usar o itemgetter do operator, que faz parte de uma instalação
padrão do Python:
from operator import itemgetter
max(lista_tuplas, key=itemgetter(1))
(3, 4, 2)
max(lista_tuplas, key=itemgetter(2))
(1, 2, 3)
Lembre-se: em Python, a contagem começa de zero :-)
Trabalhando com dicionários #
O que ocorre se for passado um dicionário? Por padrão, retornará a maior chave do dicionário. No exemplo, as chaves são strings, então retorna a string com maior primeira letra (posição no alfabeto):
elementos = {'carbono': 6,
'ouro': 79,
'cálcio': 20,
'hidrogênio': 1,
'chumbo': 82, }
max(elementos)
'ouro'
Se quisermos o critério de maior valor, ao invés da maior chave, podemos usar o
método get do dicionário:
max(elementos, key=elementos.get)
'chumbo'
Repare que foi retornada a chave que possui o maior valor associado. É mais útil retornar o par (chave, valor). Podemos usar uma função anônima lambda para isso.
Retornar o par (chave, valor) com maior chave:
max(elementos.items(), key=lambda k: k[0])
('ouro', 79)
Retornar o par (chave, valor) com maior valor:
max(elementos.items(), key=lambda k: k[1])
('chumbo', 82)
Trabalhando com números em forma de string #
Para finalizar, já vimos que com strings se retorna o maior valor posicional:
strings = ['1', '100', '111', '2']
max(strings)
'2'
O retorno foi ‘2’ por ser o maior valor comparando as primeiras posições de cada
string. Mas, se quisermos o maior número inteiro, basta usar a função int como
key:
max(strings, key=int)
'111'
Conclusão #
Sabia de todas essas possibilidades de uso da função max? Caso tenha faltado
algum uso interessante, deixe nos comentários.
O caso do parâmetro key é um exemplo clássico da importância de ler a
documentação quando usamos alguma função pela primeira vez. Acabamos por
descobrir mais funcionalidades do que a que se apresenta mais obviamente no
primeiro uso.
Ah, e tudo que foi mostrado aqui nesse post vale de forma análoga para a função
min ;-)
Gostou desse artigo? Ele faz parte do Drops de programação, um conjunto de posts mais curtos voltados para fundamentos falando sobre alguns aspectos da linguagem Python e de programação em geral. Você pode ler mais desses artigos buscando a tag “drops” aqui no site.
Até a próxima!