Ordenação em Listas
Existem dois métodos primários para organizar listas: o método sort da classe list e a função embutida sorted. O sort modifica a lista original in-place e não retorna nada, enquanto sorted produz uma nova lista ordenada.
dados_originais = [5, -2, 9, -7, 1]
# Usando sorted para criar uma nova lista ordenada
lista_crescente = sorted(dados_originais)
print("Lista crescente (nova):", lista_crescente) # Saída: [-7, -2, 1, 5, 9]
print("Lista original inalterada:", dados_originais) # Saída: [5, -2, 9, -7, 1]
# Usando sort para ordenar a lista original
dados_originais.sort(reverse=True)
print("Lista decrescente (modificada):", dados_originais) # Saída: [9, 5, 1, -2, -7]
Ordenação em Dicionários
Para ordenar um dicionário, convertemos seus itens (pares chave-valor) em uma lista de tuplas. A função sorted é então aplicada com um parâmetro key para definir o critério de ordenação (pela chave ou pelo valor).
vendas = {"banana": 15, "maçã": 28, "laranja": 7, "uva": 22}
# Ordenando pelos valores usando uma expressão lambda
itens_ordenados_valor = sorted(vendas.items(), key=lambda par: par[1])
print("Ordenado por valor:", itens_ordenados_valor)
# Saída: [('laranja', 7), ('banana', 15), ('uva', 22), ('maçã', 28)]
# Ordenando pelas chaves (alfabeticamente)
itens_ordenados_chave = sorted(vendas.items(), key=lambda par: par[0])
print("Ordenado por chave:", itens_ordenados_chave)
# Saída: [('banana', 15), ('laranja', 7), ('maçã', 28), ('uva', 22)]
O módulo operator oferece uma alternativa mais performática ao lambda.
from operator import itemgetter
itens_ordenados_valor_op = sorted(vendas.items(), key=itemgetter(1))
print("Ordenado por valor (operator):", itens_ordenados_valor_op)
Para dados mais complexos, como uma lista de tuplas com múltiplos campos, o parâmetro key pode selecionar qualquer elemento.
produtos = [
("Notebook", 4500),
("Monitor", 1200),
("Teclado", 150),
("Mouse", 80)
]
# Ordenando pelo preço (índice 1 da tupla)
produtos_baratos = sorted(produtos, key=lambda item: item[1])
print("Produtos do mais barato ao mais caro:", produtos_baratos)
Ordenação em Arays NumPy
O NumPy introduz o conceito de ordenação ao longo de um eixo (axis). Para matrizes bidimensionais, axis=0 ordena as colunas (separdaamente) e axis=1 ordena as linhas.
import numpy as np
matriz = np.array([[8, 3], [5, 9], [2, 7]])
print("Matriz original:\n", matriz)
# Ordena cada linha individualmente
matriz.sort(axis=1)
print("Matriz com linhas ordenadas:\n", matriz)
# Saída: [[3, 8], [5, 9], [2, 7]]
# Ordena cada coluna individualmente
matriz.sort(axis=0)
print("Matriz com colunas ordenadas:\n", matriz)
# Saída: [[2, 7], [3, 8], [5, 9]]
A função argsort não retorna os valores ordenados, mas sim os índices que dariam origem a uma lista ordenada.
vetor = np.array([10, 30, 20, 50, 40])
indices_ordenacao = np.argsort(vetor)
print("Índices para ordenar:", indices_ordenacao) # Saída: [0, 2, 1, 4, 3]
print("Vetor ordenado (usando os índices):", vetor[indices_ordenacao])