Ir para o conteúdo principal

Função max em Python

·725 palavras·4 minutos·
Programação Python Max Min Drops
Autor
Francisco Bustamante
Um químico trabalhando com Ciência de Dados e Programação em Python.
Tabela de conteúdos

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!

Relacionados

Formatação de strings em Python
·1544 palavras·8 minutos
Programação Python String Drops
Passamos parte considerável do tempo lidando com strings, então é importante sabermos como apresentá-las da forma desejada. É o que veremos neste artigo com diversos exemplos.
Sequências infinitas em Python - Fibonacci como você nunca viu
·1038 palavras·5 minutos
Programação Python Itertools Islice Drops
Você sabia que é possível criar uma sequência infinita sem ter problemas de memória e ainda consumir essa sequência da forma que você quiser? Hoje veremos um método específico do módulo itertools, o islice, que é excelente para nosso propósito. Aprenderemos a utilizá-lo com o exemplo da série de Fibonacci.
Funções any e all em Python
·2245 palavras·11 minutos
Programação Python Any All Drops
Neste artigo, vamos ver como funcionam as funções all e any, presentes numa instalação padrão da linguagem Python. E, mais, vamos ver a utilidade de cada uma dessas funções e cuidados ao utilizá-las com base em uma análise de complexidade.