Funções Python: Organizando Elementos Com a Função sort()
Desde criança aprendemos que organizar nossas coisas é uma ação necessária. Organizávamos nossos brinquedos, livros, materiais escolares e hoje organizamos nosso tempo, nosso código, nossos arquivos na área de trabalho e até organizamos a forma como uma informação será exibida para o usuário. Nesse último caso não precisamos fazer muito esforço, felizmente existem funções em Python que facilitam esse processo. A função que aprenderemos hoje se chama: sort.
Aplicando a Função sort() No Código
A função sort é bem simples de usar. De acordo com a documentação de Python, sua sintaxe é a seguinte:
list.sort(*, key=None, reverse=False)
Vamos entender cada um dos elementos acima.
- list: isso aqui se refere ao elemento que você criou e que vai ser organizado pela função sort;
- sort: essa é a função que usaremos para organizar o elemento que criaremos daqui a pouco;
- *: basicamente esse asterisco está dizendo que nós devemos passar o nome do parâmetro (key e/ou reverse) junto com o valor que desejamos passar para ele. Não se preocupe se ficou confuso, mostrarei alguns exemplos depois.
- key: com esse parâmetro a gente pode definir como queremos que seja a organização dos elementos que criamos (não é obrigatório utilizar esse parâmetro);
- reverse: com esse parâmetro nós podemos escolher se queremos que a ordem seja normal ou ao contrário (não é obrigatório utilizar esse parâmetro).
Vamos programar um pouco e com o passar dos códigos você vai entender melhor como funciona o sort.
Primeiro precisamos criar um elemento. Eu vou criar uma lista da seguinte forma:
lista_exemplo = [20, 1, 9, 4, 85, 99, 87, 90]
Agora vamos utilizar o sort para organizar essa lista por ordem crescente. Nosso código ficará dessa forma:
lista_exemplo.sort()
print(lista_exemplo)
O resultado que obteremos será esse:
[1, 4, 9, 20, 85, 87, 90, 99]
Se você quiser que o resultado seja decrescente, você pode usar o parâmetro "reverse" para fazer isso. Para que funcione corretamente, você precisa inserir a palavra "reverse=" e a palavra "True" dentro da função. Talvez você esteja se perguntando: mas eu não posso escrever apenas "True"? Não. Aquele asterisco que foi mencionado no 3° item nos obriga a escrever o nome do parâmetro e o valor que queremos passar. Portanto, para que nosso código dê certo, precisamos fazer dessa forma:
lista_exemplo.sort(reverse=True)
print(lista_exemplo)
Nosso resultado será:
[99, 90, 87, 85, 20, 9, 4, 1]
Bem tranquilo, não? Agora que conseguimos organizar nossa lista em ordem crescente e decrescente, vamos criar uma nova lista, mas dessa vez com nomes. Minha lista ficará assim:
nomes = ['Camila', 'Maria', 'Lucia', 'Ana', 'Thiago', 'Daniele']
nomes.sort()
Se optarmos por utilizar apenas a função sem parâmetros, nosso resultado será esse:
['Ana', 'Camila', 'Daniele', 'Lucia', 'Maria', 'Thiago']
A ordem aplicada pelo sort nesse caso, foi a ordem alfabética, mas imagine que eu queira organizar os nomes pela quantidade de letras, como faríamos isso? Simples, usaremos o parâmetro "key=" e o valor que passaremos será o "len". Nosso código ficará assim:
['Ana', 'Maria', 'Lucia', 'Camila', 'Thiago', 'Daniele']
Se quisermos que esse resultado apareça ao contrário, podemos aplicar o "reverse=" na nossa função. O código ficará assim:
nomes.sort(key=len, reverse=True)
print(nomes)
O resultado será esse:
['Daniele', 'Camila', 'Thiago', 'Maria', 'Lucia', 'Ana']
Se você quiser utilizar outros critérios de organização, você pode desenvolver uma função e passar o nome dela para o parâmetro "Key". Vou mostrar um exemplo:
def terceiro_caractere(elemento):
return elemento[2]
nomes.sort(key=terceiro_caractere)
print(nomes)
Nosso resultado será esse:
['Ana', 'Lucia', 'Thiago', 'Camila', 'Daniele', 'Maria']
No exemplo acima, o critério de organização foi baseado na terceira letra de cada nome. Observe um exemplo da lógica aplicada:
Agora que já sabemos como trabalhar com o sort, vamos entender como essa simples função funciona.
Entendendo a Lógica Por Trás Do sort()
Por trás dessa função simples, existe uma imensa lógica por trás. Vamos começar destacando o fato de que essa função usa um algoritmo chamado Timsort e o Timsort é um algoritmo híbrido que se baseia em dois outros algoritmos de ordenação chamados Merge Sort e Insertion Sort. Vamos entender como cada um deles trabalha.
Merge Sort
Começando pelo Merge Sort, esse algoritmo se baseia na ideia do dividir para conquistar. Observe:
Como podemos ver na imagem acima, o Merge Sort divide os valores em blocos até não poder dividir mais, quando isso acontece, ele junta os valores em duplas; compara qual valor é o menor e junta os valores na ordem correta. Ele vai continuar comparando e juntando até que o resultado final seja a ordem correta dos elementos.
Insertion Sort
O Insertion Sort funciona de uma forma diferente do Merge Sort. Observe:
O Insertion Sort compara o valor atual com o próximo ou o anterior (se tiver). Na imagem acima sua lógica é a seguinte:
- Compara o 7 com 4. 4 é menor que 7, então muda de lugar;
- 7 se compara com o 5, 5 é menor, então muda de lugar;
- 5 se compara com o 4, 4 é menor, permanecem no mesmo lugar.
- Novamente o 7 se compara com o próximo (9), 7 é menor, permanece no lugar.
Esse processo vai durar até que todos os valores estejam na posição correta. Se você reparar, o número 1 vai ser o valor que mais vai se movimentar. Quando o 9 se comparar com ele, eles irão mudar de lugar, depois o 1 vai se comparar com o 8 e mudar de lugar novamente. Esse processo vai se repetir várias vezes e só vai parar quando o número 1 estiver no lugar correto.
Timsort
Agora que já entendemos como esses algoritmos de ordenação funcionam, fica um pouco mais fácil de entender como o Timsort trabalha. Observe:
O que está acontecendo na imagem acima é o seguinte, a nossa lista será dividida em blocos (runs) e através do Insertion Sort os elementos serão organizados na ordem correta, depois eles vão ser unidos e organizados através do Merge Sort. No final, teremos nossa lista organizada na ordem correta.
Esse foi o artigo de hoje, espero que vocês tenham gostado.
Referências
https://www.programiz.com/dsa/merge-sort
https://pt.khanacademy.org/computing/computer-science/algorithms/merge-sort/a/overview-of-merge-sort
https://www.geeksforgeeks.org/insertion-sort/
https://www.programiz.com/python-programming/methods/list/sort
https://www.w3schools.com/python/ref_list_sort.asp
https://www.algowalker.com/tim-sort.html
https://www.educative./io/answers/what-is-timsort
https://docs.python.org/pt-br/dev/library/stdtypes.html#list.sort