Article image
Lucas Soares
Lucas Soares10/01/2024 23:39
Compartilhe

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.

image

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.

image

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

Compartilhe
Comentários (1)

DP

Delmoacir Pereira - 03/02/2024 07:05

Amigo ficou muito bom , parabens !