Função max em Python

função max em python

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.

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!

Compartilhe:

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Rolar para cima