Pular para o conteúdo
Editor

Ordenação em Python: sort(), sorted(), key e ordem personalizada

Intermediário25 min6 exercícios85 XP

Este tutorial foi traduzido do original em inglês.Read in EnglishLeer en españolЧитать на русскомอ่านภาษาไทยAvisar sobre um erro de tradução

0/6 exercícios

Imagine a estante de livros da sua casa. Os livros estão espalhados por todo lado: alguns por título, outros por cor, alguns enfiados de lado. Achar qualquer coisa leva uma eternidade.

Agora imagine organizar essa estante em ordem alfabética. De repente, achar qualquer livro leva segundos. Esse é o poder da ordenação: ela transforma o caos em ordem.

O Python oferece duas ferramentas principais para ordenar: o método sort() e a função sorted(). Elas parecem iguais, mas funcionam de forma diferente. Neste tutorial, você vai aprender quando usar cada uma, como ordenar em ordem inversa e como ordenar com regras próprias usando funções key.

Qual é a diferença entre sort() e sorted()?

Esta é a distinção mais importante da ordenação em Python. O método sort() altera diretamente a lista original. A função sorted() cria uma lista nova, já ordenada, e deixa a original intacta.

Pense assim: sort() é como reorganizar os livros na sua estante. sorted() é como montar um catálogo ordenado e deixar a estante exatamente como estava.

sort() altera a própria lista
# sort() modifies the original list
numbers = [5, 2, 8, 1, 9]
numbers.sort()
print(numbers) # [1, 2, 5, 8, 9] - the list itself changed
Saída
[1, 2, 5, 8, 9]
sorted() cria uma lista nova
# sorted() returns a NEW sorted list
numbers = [5, 2, 8, 1, 9]
result = sorted(numbers)
print(result) # [1, 2, 5, 8, 9] - a new list
print(numbers) # [5, 2, 8, 1, 9] - original unchanged!
Saída
[1, 2, 5, 8, 9]
[5, 2, 8, 1, 9]
Bug: atribuir o resultado de sort()
names = ['Charlie', 'Alice', 'Bob']
result = names.sort()
print(result)  # None!
Correção: use sorted() para ter uma lista nova
names = ['Charlie', 'Alice', 'Bob']
result = sorted(names)
print(result)  # ['Alice', 'Bob', 'Charlie']

Há outra grande diferença: sorted() funciona com qualquer iterável (strings, tuplas, dicionários e até geradores). O método sort() só funciona com listas.

sorted() funciona com qualquer iterável
# sorted() works on strings too
letters = sorted("python")
print(letters) # ['h', 'n', 'o', 'p', 't', 'y']
# sorted() works on tuples
coords = sorted((3, 1, 4, 1, 5))
print(coords) # [1, 1, 3, 4, 5] - result is always a list
Saída
['h', 'n', 'o', 'p', 't', 'y']
[1, 1, 3, 4, 5]

Como ordenar em ordem inversa

Tanto sort() quanto sorted() aceitam um parâmetro reverse. Defina-o como True para ordenar do maior para o menor, em vez do menor para o maior.

Ordenando em ordem crescente e decrescente
scores = [72, 95, 88, 61, 100]
# Ascending (default)
print(sorted(scores)) # [61, 72, 88, 95, 100]
# Descending
print(sorted(scores, reverse=True)) # [100, 95, 88, 72, 61]
Saída
[61, 72, 88, 95, 100]
[100, 95, 88, 72, 61]

Por padrão, strings são ordenadas em ordem alfabética. Com reverse=True, elas ficam em ordem alfabética inversa.

Ordenando strings em ordem inversa
fruits = ['banana', 'apple', 'cherry', 'date']
print(sorted(fruits)) # ['apple', 'banana', 'cherry', 'date']
print(sorted(fruits, reverse=True)) # ['date', 'cherry', 'banana', 'apple']
Saída
['apple', 'banana', 'cherry', 'date']
['date', 'cherry', 'banana', 'apple']

O que são funções key na ordenação em Python?

Às vezes você não quer ordenar pelos próprios valores. Você quer ordenar por alguma propriedade de cada valor. Por exemplo, ordenar palavras pelo tamanho, e não em ordem alfabética.

O parâmetro key permite passar uma função que transforma cada item antes da comparação. O Python aplica essa função a todos os itens e depois ordena com base nos resultados. Os itens originais continuam intactos: só a ordem muda.

Ordenando pelo tamanho da string com key=len
# Sort words by length instead of alphabetically
words = ['banana', 'pie', 'strawberry', 'kiwi']
result = sorted(words, key=len)
print(result) # ['pie', 'kiwi', 'banana', 'strawberry']
Saída
['pie', 'kiwi', 'banana', 'strawberry']

Aqui, len é a função key. O Python chama len() em cada palavra e usa esses tamanhos para decidir a ordem. "pie" tem 3 letras, "kiwi" tem 4, e assim por diante.

Você pode usar qualquer função como key. Um exemplo comum é ordenar sem diferenciar maiúsculas de minúsculas, usando str.lower.

Ordenação sem diferenciar maiúsculas de minúsculas
# Without key - uppercase letters sort before lowercase
names = ['alice', 'Bob', 'CHARLIE', 'dave']
print(sorted(names)) # ['Bob', 'CHARLIE', 'alice', 'dave']
# With key=str.lower - true alphabetical order
print(sorted(names, key=str.lower)) # ['alice', 'Bob', 'CHARLIE', 'dave']
Saída
['Bob', 'CHARLIE', 'alice', 'dave']
['alice', 'Bob', 'CHARLIE', 'dave']

Como ordenar com funções lambda

Funções embutidas como len e str.lower só levam você até certo ponto. Quando precisa de uma lógica de ordenação própria, você usa uma lambda: uma função pequena e anônima, escrita em uma linha.

Uma lambda recebe um item e retorna o valor que será usado na ordenação. A sintaxe é lambda item: expression.

Ordenando pelo último dígito com uma lambda
# Sort numbers by their last digit
numbers = [23, 45, 12, 67, 34, 89]
result = sorted(numbers, key=lambda x: x % 10)
print(result) # [12, 23, 34, 45, 67, 89]
Saída
[12, 23, 34, 45, 67, 89]

A lambda lambda x: x % 10 recebe cada número e retorna o último dígito dele (o resto da divisão por 10). O Python então ordena por esses últimos dígitos: 2, 3, 4, 5, 7, 9.

Ordenando pelo último caractere
# Sort strings by their last character
words = ['hello', 'zebra', 'apple', 'mango']
result = sorted(words, key=lambda w: w[-1])
print(result) # ['zebra', 'apple', 'mango', 'hello']
Saída
['zebra', 'apple', 'hello', 'mango']
Ordenação por vários critérios com tuplas
# Sort by length first, then alphabetically
words = ['cat', 'bat', 'elephant', 'ant', 'dog']
result = sorted(words, key=lambda w: (len(w), w))
print(result) # ['ant', 'bat', 'cat', 'dog', 'elephant']
Saída
['ant', 'bat', 'cat', 'dog', 'elephant']

Como ordenar dicionários e dados mais complexos

Em programas reais, raramente você ordena listas simples de números. É mais comum ordenar listas de dicionários, como alunos por nota ou produtos por preço.

Ordenando uma lista de dicionários por uma chave
students = [
{'name': 'Alice', 'grade': 92},
{'name': 'Bob', 'grade': 85},
{'name': 'Charlie', 'grade': 97},
{'name': 'Diana', 'grade': 88},
]
# Sort by grade (ascending)
by_grade = sorted(students, key=lambda s: s['grade'])
for s in by_grade:
print(f"{s['name']}: {s['grade']}")
Saída
Bob: 85
Diana: 88
Alice: 92
Charlie: 97
Ordenando dicionários em ordem decrescente
students = [
{'name': 'Alice', 'grade': 92},
{'name': 'Bob', 'grade': 85},
{'name': 'Charlie', 'grade': 97},
{'name': 'Diana', 'grade': 88},
]
# Sort by grade (highest first)
top_students = sorted(students, key=lambda s: s['grade'], reverse=True)
for s in top_students:
print(f"{s['name']}: {s['grade']}")
Saída
Charlie: 97
Alice: 92
Diana: 88
Bob: 85

Você também pode ordenar as chaves ou os valores do próprio dicionário. Por padrão, a função sorted() percorre as chaves de um dicionário.

Ordenando chaves e valores de um dicionário
prices = {'banana': 0.25, 'apple': 0.75, 'cherry': 3.25, 'date': 1.75}
# Sort by key (fruit name)
for fruit in sorted(prices):
print(f"{fruit}: ${prices[fruit]}")
print()
# Sort by value (price)
for fruit in sorted(prices, key=lambda f: prices[f]):
print(f"{fruit}: ${prices[fruit]}")
Saída
apple: $0.75
banana: $0.25
cherry: $3.25
date: $1.75

banana: $0.25
apple: $0.75
date: $1.75
cherry: $3.25

O que é ordenação estável e por que ela importa?

O Python usa um algoritmo de ordenação chamado Timsort, que é estável. Isso quer dizer que, quando dois itens são iguais segundo a chave de ordenação, eles mantêm a ordem original.

Isso importa muito na prática. Se você ordena alunos por nota e dois alunos têm a mesma nota, eles ficam na mesma ordem em que estavam antes da ordenação.

A ordenação estável preserva a ordem original nos empates
students = [
{'name': 'Alice', 'grade': 90},
{'name': 'Bob', 'grade': 85},
{'name': 'Charlie', 'grade': 90},
{'name': 'Diana', 'grade': 85},
]
# Sort by grade - ties keep original order
result = sorted(students, key=lambda s: s['grade'])
for s in result:
print(f"{s['name']}: {s['grade']}")
# Bob: 85, Diana: 85, Alice: 90, Charlie: 90
# Bob comes before Diana (original order preserved)
# Alice comes before Charlie (original order preserved)
Saída
Bob: 85
Diana: 85
Alice: 90
Charlie: 90

Exercícios práticos

Ordene uma lista de números
Escreva o código

Você tem uma lista de notas de provas. Exiba as notas ordenadas da menor para a maior e, na linha seguinte, da maior para a menor.

Use sorted() para que a lista original continue igual.

scores = [78, 92, 65, 88, 95, 71]
# Print scores low to high
# Print scores high to low
Preveja a saída: sort() x sorted()
Preveja a saída

Leia o código abaixo com atenção. O que ele vai exibir? Lembre-se da diferença principal entre sort() e sorted().

Digite a saída exata.

nums = [3, 1, 4, 1, 5]
result = nums.sort()
print(result)
print(nums)
Ordene palavras pelo tamanho
Escreva o código

Ordene a lista de palavras pelo tamanho (as mais curtas primeiro). Se duas palavras tiverem o mesmo tamanho, elas devem continuar na ordem original.

Exiba a lista ordenada.

words = ['elephant', 'cat', 'giraffe', 'ox', 'bear', 'ant']
# Sort by length and print
Corrija o bug: ordenação que diferencia maiúsculas
Corrija o erro

O código abaixo tenta ordenar nomes em ordem alfabética, mas os nomes com maiúscula e com minúscula estão se misturando de forma errada. Corrija a ordenação para que ela siga a ordem alfabética de verdade, sem importar se as letras são maiúsculas ou minúsculas.

A saída deve ser: ['alice', 'Bob', 'Charlie', 'dave', 'Eve']

names = ['Charlie', 'alice', 'Eve', 'dave', 'Bob']
result = sorted(names)
print(result)
Ordene alunos pela nota
Escreva o código

Ordene a lista de alunos pela nota, da maior para a menor. Exiba o nome e a nota de cada aluno em uma linha separada, no formato: Name: Grade

students = [
{'name': 'Alice', 'grade': 88},
{'name': 'Bob', 'grade': 95},
{'name': 'Charlie', 'grade': 72},
{'name': 'Diana', 'grade': 91},
]
# Sort by grade (highest first) and print each student
Ordene por vários critérios
Escreva o código

Ordene a lista de produtos primeiro pela categoria (em ordem alfabética) e depois, dentro de cada categoria, pelo preço (o menor primeiro).

Exiba cada produto em uma linha separada, no formato: category: name - $price

products = [
{'name': 'Banana', 'category': 'fruit', 'price': 1.20},
{'name': 'Milk', 'category': 'dairy', 'price': 3.50},
{'name': 'Apple', 'category': 'fruit', 'price': 0.80},
{'name': 'Cheese', 'category': 'dairy', 'price': 5.00},
{'name': 'Cherry', 'category': 'fruit', 'price': 4.00},
{'name': 'Yogurt', 'category': 'dairy', 'price': 2.50},
]
# Sort by category, then by price within each category

Tutoriais relacionados

Este tutorial foi útil?