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.
Tópicos
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.
A função max e seu 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
😉
Aproveite para acompanhar o Ciência Programada nas redes sociais.
Gostou desse artigo? Ele faz parte do Python Drops, 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!