Como usar sort em Python
- #Python
Como usar o sort em Python
A ordenação de elementos é uma operação fundamental na programação. E nesse artigo, pretendo explorar como podemos usar a função nativa do Python, o "sort()". Essa função é capaz de ordenar elementos de maneira eficiente e flexível para sua aplicação.
E nesse artigo vamos falar de como essa função funciona, como usá-la, suas nuances e como ela funciona debaixo do capô. Mostraremos exemplos de ordenação simples de lista até ordenações mais complexas e casos de usos que poderia se encaixar muito bem.
Uso básico do sort
Para usá-la basta colocar chamar a lista com valores do mesmo tipo e acrescentar o ".sort()" no final.
lista_numerica = [3, 4, 1, 6, 8]
lista_numerica.sort()
print(lista_numerica)
# Saida: [1, 3, 4, 6, 8]
lista_alphanumerica = ['b','j','a','d','k']
lista_alphanumerica.sort()
print(lista_alphanumerica)
# Saida: ['a', 'b', 'd', 'j', 'k']
Também podemos inverter para ordem crescente ou decrescente, usando o atributo 'reverse = True'.
lista_numerica = [3, 4, 1, 6, 8]
lista_numerica.sort(reverse=True)
print(lista_numerica)
# Saida: [8, 6, 4, 3, 1]
lista_alphanumerica = ['b','j','a','d','k']
lista_alphanumerica.sort(reverse=True)
print(lista_alphanumerica)
# Saida: ['k', 'j', 'd', 'b', 'a']
Usando o sort em uma lista de dicionário
Para ordenar uma lista de dicionaria é um pouco mais elaborado, mas também não tão complexo. É necessário informar ao método 'sort()' o critério de ordenação.
Para informar esse critério, passamos o parâmetro 'key' com um lambda, indicando o campo a qual vamos ordenar.
produtos = [
{"produto": "Camiseta", "preco": 25.99, "quantidade": 10},
{"produto": "Calça Jeans", "preco": 39.99, "quantidade": 5},
{"produto": "Tênis", "preco": 49.99, "quantidade": 8},
{"produto": "Boné", "preco": 12.50, "quantidade": 15},
{"produto": "Meias", "preco": 5.99, "quantidade": 20}
]
produtos.sort(key=lambda value:value['preco'])
print(*produtos, sep='\n')
Isso resultará na saída
{'produto': 'Meias', 'preco': 5.99, 'quantidade': 20}
{'produto': 'Boné', 'preco': 12.5, 'quantidade': 15}
{'produto': 'Camiseta', 'preco': 25.99, 'quantidade': 10}
{'produto': 'Calça Jeans', 'preco': 39.99, 'quantidade': 5}
{'produto': 'Tênis', 'preco': 49.99, 'quantidade': 8}
Também é possível definir uma função nomeada para tornar a leitura mais clara.
def ordenar_lista(lista):
return lista['preco']
produtos.sort(key=ordenar_lista)
print(*produtos, sep='\n')
Explorando o sort
O método 'sort' oferece uma notável flexibilidade ao possibilitar a ordenação não apenas de estrutura simples, mas também de coleções complexas ou aquelas que requerem cálculo prévio antes da ordenação, por exemplo.
alunos = [
{"nome": "Lucas", "notas": [80, 75, 90]},
{"nome": "Maria", "notas": [95, 85, 70]},
{"nome": "Camila", "notas": [60, 87, 80]},
{"nome": "Samuel", "notas": [70, 92, 88]},
{"nome": "Vitoria", "notas": [100, 65, 78]}
]
def calcular_media(aluno):
return sum(aluno['notas']) / len(aluno['notas'])
alunos.sort(key=calcular_media)
print(*alunos, sep='\n')
Isso resultará na saída
{'nome': 'Camila', 'notas': [60, 87, 80]}
{'nome': 'Vitoria', 'notas': [100, 65, 78]}
{'nome': 'Lucas', 'notas': [80, 75, 90]}
{'nome': 'Maria', 'notas': [95, 85, 70]}
{'nome': 'Samuel', 'notas': [70, 92, 88]}
Para mais exemplos de como usar o sort() pode se encontrar na documentação https://docs.python.org/pt-br/3/howto/sorting.html
ou no site da w3schools
https://www.w3schools.com/python/ref_list_sort.asp
Caso de Uso
Vamos considerar que estejamos fazendo um programa para um hospital que tem uma sala de emergência e que precisa atender pacientes com base na gravidade de seus casos.
pacientes = [
{"nome": "João", "gravidade": "Crítica"},
{"nome": "Maria", "gravidade": "Moderada"},
{"nome": "Carlos", "gravidade": "Crítica"},
{"nome": "Ana", "gravidade": "Leve"},
]
def definir_prioridade(paciente):
if paciente['gravidade'] == 'Crítica':
return 1
elif paciente['gravidade'] == 'Moderada':
return 2
else:
return 3
pacientes.sort(key=definir_prioridade)
print(*pacientes, sep='\n')
Onde a saída seria
{'nome': 'João', 'gravidade': 'Crítica'}
{'nome': 'Carlos', 'gravidade': 'Crítica'}
{'nome': 'Maria', 'gravidade': 'Moderada'}
{'nome': 'Ana', 'gravidade': 'Leve'}
Como funciona o sort por debaixo dos panos
A ideia por trás do Tim Sort é explorar a ordem existente nos dados para reduzir o número de comparação e trocas.
Ele faz isso dividindo a lista em sub-listas chamados de 'runs', que já estão classificados, e logo após isso utiliza um algoritmo de fusão para ordenar essas sub-listas novamente.
O Tim Sort opera em cinco passos, sendo eles
1 - Definir o tamanho dá runs: Ele defini o tamanho mínimo de execução, onde o valor mínimo recomendado é de 32 elementos. Caso uma sequência não atingir esse tamanho, ela é aumentada para atender esse requisito.
2 - Dividir em pequenas runs: Ele dividiu a lista em sub-listas e as classifica usando um algoritmo de fusão.
3 - Mescla as runs: Ele ira mesclar as runs ordenados usando um algoritmo de fusão até que toda a lista esteja ordenada.
4 - Reajuste do tamanho das runs: Após cada interação de mesclagem, o seu tamanho é dobrada até exceder o tamanho da lista.
5 - Repetição: Repete o processo de mesclagem até que toda lista esteja ordenada.
Diferença entre sort e sorted
Em resumo, o "sort()" altera a ordem dos elementos na lista original.
O método "sorted()" cria uma nova lista ao realizar uma cópia da lista original e então ordena essa nova lista, sem afetar a lista original. Isso pode ser útil em determinadas situações.
Eficiência
O 'sort()' utiliza o algoritmo Timsort, que faz uso da ordenação por comparação de chaves, que é um híbrido derivado dos algoritmos 'merge sort' e do 'insertion sort'.
A eficiência do TimSort é incrível em diversos casos. Ele possui uma complexidade media e de pior caso de O(n log n), onde 'n' é o número de elementos na lista. Isso significa que o tempo de execução aumenta de forma logarítmica com o tamanho da lista.
Na imagem abaixo mostra as diferenças entre vários algoritmos de ordenações e como o Tim Sort se apresenta em cada situação.
Desvantagem
Uma desvantagem que o 'sort()' tem é que dependendo do tamanho da lista e do tipo que ele tem. Ele pode acabar exigindo mais recursos, como CPU e Memoria RAM.
Apesar de ter um desempenho razoável na média e de ser bastante eficiente em situações ideais, em alguns casos o desempenho no pior cenário pode ser superior ao de algoritmos de ordenação mais especializados.
Conclusão
Através dos métodos sort(), é viável ordenar uma variedade de listas com diferentes tipos de informações, permitindo inclusive a aplicação de critérios personalizados quando necessário. Adicionalmente, atributos como reverse e key oferecem uma flexibilidade adicional durante o processo de ordenação. Dominar o uso do Python Sort é uma habilidade fundamental para qualquer desenvolvedor que lide com a organização de dados em seus projetos.
Códigos utilizados
https://colab.research.google.com/drive/1gTVp8eiqOVn6ISdA9YxC91vzQ3xUMuJG?usp=sharing