Pular para o conteúdo

Como Ordenar uma String em Python

[

Como usar sorted() e .sort() em Python

por David Fundakowski

Todos os programadores terão que escrever código para classificar itens ou dados em algum momento. A ordenação pode ser fundamental para a experiência do usuário em seu aplicativo, seja para ordenar a atividade mais recente de um usuário por data e hora, ou para colocar uma lista de destinatários de e-mail em ordem alfabética por sobrenome. A funcionalidade de ordenação do Python oferece recursos robustos para realizar a ordenação básica ou personalizar a ordem em um nível granular.

Neste guia, você aprenderá como classificar vários tipos de dados em diferentes estruturas de dados, personalizar a ordem e trabalhar com dois métodos diferentes de ordenação em Python.

Até o final deste tutorial, você saberá como:

  • Implementar a ordenação básica do Python em estruturas de dados
  • Diferenciar entre sorted() e .sort()
  • Personalizar uma ordem de classificação complexa em seu código com base em requisitos exclusivos

Para este tutorial, você precisará de uma compreensão básica de listas e tuplas, assim como de conjuntos. Essas estruturas de dados serão usadas neste tutorial e algumas operações básicas serão realizadas nelas. Além disso, este tutorial utiliza o Python 3, portanto, a saída de exemplo pode variar ligeiramente se você estiver usando o Python 2.

Ordenando Valores com sorted()

Para começar com a ordenação em Python, primeiro você vai aprender como ordenar dados numéricos e dados de string.

Ordenando Números

Você pode usar o Python para classificar uma lista usando o sorted(). Neste exemplo, uma lista de inteiros é definida e, em seguida, o sorted() é chamado com a variável numbers como argumento:

>>> numbers = [6, 9, 3, 1]
>>> sorted(numbers)
[1, 3, 6, 9]
>>> numbers
[6, 9, 3, 1]

A saída deste código é uma nova lista ordenada. Quando a variável original é impressa, os valores iniciais não são alterados.

Este exemplo mostra quatro características importantes do sorted():

  1. A função sorted() não precisou ser definida. É uma função integrada que está disponível em uma instalação padrão do Python.
  2. sorted(), sem argumentos ou parâmetros adicionais, está ordenando os valores em numbers em ordem crescente, ou seja, do menor para o maior.
  3. A variável original numbers não é alterada porque o sorted() fornece a saída ordenada sem alterar o valor original.
  4. Quando o sorted() é chamado, ele fornece uma lista ordenada como valor de retorno.

Isso significa que o sorted() pode ser usado em uma lista, e a saída pode ser atribuída imediatamente a uma variável:

>>> numbers = [6, 9, 3, 1]
>>> numbers_sorted = sorted(numbers)
>>> numbers_sorted
[1, 3, 6, 9]
>>> numbers
[6, 9, 3, 1]

Ordenando Strings

Assim como os números, as strings também podem ser ordenadas usando o sorted(). Neste exemplo, uma lista de strings é definida e sorted() é chamado com a variável fruits como argumento:

>>> fruits = ['banana', 'apple', 'orange', 'grape']
>>> sorted(fruits)
['apple', 'banana', 'grape', 'orange']
>>> fruits
['banana', 'apple', 'orange', 'grape']

A saída deste código é uma nova lista ordenada de strings. Da mesma forma que acontece com os números, a variável original fruits não é alterada.

Quando as strings são ordenadas, a ordem segue a ordem alfabética padrão. As letras maiúsculas e minúsculas são levadas em consideração ao comparar as strings. Portanto, ‘apple’ vem antes de ‘banana’ porque ‘a’ vem antes de ‘b’ na ordem alfabética.

Limitações e Dificuldades com a Ordenação em Python

Embora a ordenação em Python seja poderosa e flexível, há algumas limitações e dificuldades que você precisa estar ciente. Vamos abordar duas delas:

Listas com tipos de dados não comparáveis não podem ser ordenadas

Quando você está usando o sorted() ou o .sort() em uma lista, os elementos da lista devem ser comparáveis entre si. Isso significa que se a lista contiver tipos de dados que não podem ser comparados, como strings e números misturados, você não poderá usar a ordenação diretamente.

Por exemplo, suponha que você tenha a seguinte lista:

>>> mixed_list = ['apple', 1, 'banana', 2]
>>> sorted(mixed_list)
TypeError: '<' not supported between instances of 'int' and 'str'

Neste caso, ocorre um erro de tipo porque sorted() espera que todos os elementos da lista sejam do mesmo tipo ou de tipos comparáveis. Como não é possível comparar diretamente uma string com um inteiro, você obtém um TypeError.

Para contornar esse problema, você pode usar a função sorted() com um argumento adicional chamado key. O key aceita uma função de comparação personalizada como argumento, que será usada para comparar os elementos da lista. Por exemplo, se você deseja classificar a lista acima considerando apenas os elementos de string, você pode usar o seguinte código:

>>> sorted(mixed_list, key=str)
[1, 2, 'apple', 'banana']

A ordem é sensível a maiúsculas e minúsculas ao ordenar strings

Ao ordenar strings, uma coisa importante a se observar é que a ordem é sensível a maiúsculas e minúsculas. Isso significa que as letras maiúsculas vêm antes das letras minúsculas na ordem alfabética. Por exemplo:

>>> fruits = ['banana', 'Apple', 'orange', 'Grape']
>>> sorted(fruits)
['Apple', 'Grape', 'banana', 'orange']

Observe que ‘Apple’ vem antes de ‘Grape’ porque a letra ‘A’ tem um valor de código Unicode menor do que ‘G’. Portanto, a ordem das palavras é diferente da ordem alfabética esperada.

Se você quiser fazer uma ordenação sem diferenciação entre maiúsculas e minúsculas, você pode usar a função key no sorted() para realizar uma ordenação personalizada. Neste caso, você pode usar a função str.lower como argumento de key para fazer a comparação ignorar as diferenças entre maiúsculas e minúsculas:

>>> sorted(fruits, key=str.lower)
['Apple', 'banana', 'Grape', 'orange']

Neste exemplo, a função str.lower é usada como argumento para key. Ela converte todas as letras da string em minúsculas antes de fazer a comparação, resultando em uma ordenação sem diferenciação entre maiúsculas e minúsculas.

Usando sorted() com o argumento reverse

Uma funcionalidade poderosa do sorted() é a capacidade de inverter a ordem dos elementos usando o argumento reverse. Por padrão, reverse é definido como False, o que significa que os elementos serão ordenados em ordem crescente. No entanto, se você definir reverse como True, os elementos serão ordenados em ordem decrescente.

Vamos dar uma olhada em um exemplo:

>>> numbers = [9, 3, 6, 1]
>>> sorted(numbers, reverse=True)
[9, 6, 3, 1]

Aqui, ao definir reverse como True, a lista numbers é ordenada em ordem decrescente.

Usando sorted() com o argumento key

Além da funcionalidade de classificação inversa, o sorted() também permite personalizar a ordem de classificação com o argumento key. O key aceita uma função como argumento, que será usada para extrair um valor-chave dos elementos da lista. Em seguida, os elementos da lista serão ordenados com base nesses valores-chave.

Vamos ver um exemplo para entender melhor:

>>> students = ['Alice', 'bob', 'charlie']
>>> sorted(students, key=str.lower)
['Alice', 'bob', 'charlie']

Neste exemplo, a função str.lower é usada como argumento para key. Ela extrai um valor-chave convertendo todas as letras da string em minúsculas. Portanto, a ordem de classificação é baseada nas versões em minúsculas dos nomes dos alunos, resultando em uma ordenação sem diferenciação entre maiúsculas e minúsculas.

Você também pode usar funções personalizadas como argumento de key. Por exemplo, se você quiser ordenar os alunos pelo comprimento de seus nomes, você pode criar uma função que retorne o comprimento de uma string e usá-la como argumento de key:

>>> students = ['Alice', 'bob', 'charlie']
>>> sorted(students, key=len)
['bob', 'Alice', 'charlie']

Neste exemplo, a função len é usada como argumento para key. Ela retorna o comprimento de uma string. Portanto, a ordem de classificação é baseada no comprimento dos nomes dos alunos, resultando em uma ordenação crescente com base no comprimento dos nomes.

Ordenando Valores com .sort()

Além da função sorted(), o Python também fornece um método de lista chamado .sort(), que é semelhante à função sorted(), mas ordena a lista diretamente, em vez de retornar uma nova lista classificada.

Vamos ver um exemplo:

>>> numbers = [6, 9, 3, 1]
>>> numbers.sort()
>>> numbers
[1, 3, 6, 9]

Neste exemplo, o método .sort() é usado em vez da função sorted(). O .sort() é chamado diretamente na lista numbers, que é alterada em seu lugar para ficar em ordem crescente.

É importante notar que o método .sort() não retorna uma nova lista. Em vez disso, ele ordena a lista atual em seu lugar. Portanto, ao usar o método .sort(), você não precisa atribuí-lo a uma variável como no exemplo do sorted().

Quando usar sorted() e quando usar .sort()

Agora que você conhece tanto a função sorted() quanto o método .sort(), você pode estar se perguntando qual deles deve usar em suas situações específicas.

Aqui estão algumas orientações:

  • Use a função sorted() quando quiser obter uma nova lista classificada sem alterar a lista original.
  • Use o método .sort() quando quiser classificar a lista original em seu lugar sem criar uma nova lista.

Basicamente, a escolha entre sorted() e .sort() depende de se você precisa preservar a lista original ou se pode modificá-la diretamente.

Conclusão

A ordenação é uma tarefa fundamental em qualquer aplicativo de programação. O Python oferece a função sorted() e o método .sort() para ajudar na ordenação de listas e outros tipos de dados. Com o sorted(), você pode obter uma nova lista classificada sem alterar a lista original, enquanto o .sort() permite classificar a lista original diretamente. Além disso, você pode personalizar a ordenação usando os argumentos key e reverse no sorted(). Ao entender esses conceitos, você estará preparado para realizar a ordenação em Python de forma eficaz e personalizada em suas aplicações.