Como ordenar os dados por mais de uma chave?

Publicado em 2011-09-12 por Vinicius Assef

Fazer ordenação por uma chave só é bem simples. Nesse artigo vamos classificar os dados por mais de um campo.

Python tem uma função muito poderosa para ordenar listas: sorted(). Ela é poderosa porque espera receber uma função que vai retornar o conteúdo da chave que será usada para ordenar os dados.

Ordenação simples

Vejamos um exemplo:

>>> dados = ["Maria", "Beto", "Arnaldo", "Cristina"]
>>> sorted(dados)
['Arnaldo', 'Beto', 'Cristina', 'Maria']

No exemplo acima, não passamos o argumento key. Então os dados foram ordenados conforme o conteúdo da lista. OK, normal.

Criando a chave de ordenação

Agora, que tal ordenar a lista pelo tamanho dos nomes?

>>> dados = ["Maria", "Beto", "Arnaldo", "Cristina"]
>>> sorted(dados, key=len)
['Beto', 'Maria', 'Arnaldo', 'Cristina']

O resultado mostra uma lista com os nomes pequenos antes dos grandes.

Ordenando por mais de um campo

Agora vamos complicar um pouco e criar registros com vários campos:

>>> pessoas = [
...   "Vicente,49,1500",
...   "Felipe,49,2500",
...   "Roberta,41,2500",
...   "Ana,41,2500"]

Nossa regra de ordenação também será mais complexa:

  • idade (primeiro os mais jovens);
  • salário decrescente (primeiro os que ganham mais);
  • nomes em ordem alfabética.

A solução fica assim:

def chave(registro):
    nome, idade, salario = registro.split(",")
    return (int(idade), int(salario) * - 1, nome)

E para ordenar a lista:

>>> sorted(pessoas, key=chave)

Vou explicar os segredos dessa solução:

  1. A função chave(). Ela retorna uma tupla. Quando isso ocorre, sorted() classifica o primeiro item da tupla, depois o segundo, e assim por diante.

  2. O salário está multiplicado por -1 porque queremos os salários maiores primeiro.

O que achou? Simples, não?

Vinicius Assef

Eu sou apaixonado por Python e shell script.

Aprenda com seus erros e dê nome certo às coisas.