Uma das razões pelas quais o Python se destaca é a sua facilidade de uso. A sua vasta biblioteca padrão oferece diversas ferramentas que simplificam o desenvolvimento. Entre elas, destaca-se a função `sorted`.
Essa função é projetada para organizar elementos iteráveis de acordo com uma ordem específica. Sem ela, seria necessário criar algoritmos de ordenação, como Bubble Sort ou Insertion Sort, um processo frequentemente complexo. Felizmente, o Python oferece uma solução mais simples, que exploraremos neste artigo.
Introdução à Função `sorted`
A função `sorted` é uma ferramenta do Python que organiza iteráveis. Um iterável é qualquer coleção de valores que pode ser percorrida, como strings, listas, tuplas e conjuntos. Esses iteráveis geralmente não possuem uma ordem intrínseca, e a função `sorted` organiza seus elementos de acordo com um critério definido. A ordenação é valiosa por diversos motivos:
- A busca por valores se torna mais eficiente e rápida, especialmente com algoritmos como a busca binária, que exige que os valores estejam previamente ordenados.
- Permite apresentar dados de maneira organizada e intuitiva, como exibir preços do menor para o maior ou posts do mais recente para o mais antigo. Isso requer um processo para classificar listas de valores.
- Facilita análises estatísticas, como identificar o valor mais frequente em um conjunto, o que se torna mais simples quando os dados estão ordenados.
Como Usar a Função `sorted`
Como mencionado anteriormente, a função `sorted` pode ser aplicada a qualquer iterável. Ela retorna uma nova lista contendo os elementos organizados. É crucial notar que, embora a entrada possa ser de qualquer tipo iterável, o resultado será sempre uma lista.
Sintaxe da Função `sorted`
A estrutura da função `sorted` é a seguinte:
sorted(iterável, key=None, reverse=False)
O único argumento obrigatório é o `iterável`, que será a base para a ordenação.
O segundo argumento, `key`, é uma função que será aplicada a cada elemento do iterável para gerar um valor que será usado para a ordenação. Isso é especialmente útil para ordenar listas de dicionários, como veremos adiante. O valor padrão é `None`, o que significa que nenhuma função é aplicada por padrão.
O último argumento, `reverse`, quando definido como `True`, ordena os itens em ordem inversa.
A seguir, apresentaremos exemplos práticos para ilustrar o uso da função.
Exemplos de Uso da Função `sorted`
Ordenando Listas de Números
O cenário mais simples é ordenar uma lista de números. Veja o exemplo a seguir:
# Lista de números desordenados
numeros = [8, 4, 3, 9, 2, 0, 3]
# Ordenando a lista
numeros_ordenados = sorted(numeros)
# Exibindo os números ordenados
print(numeros_ordenados)
A saída desse código será:
[0, 2, 3, 3, 4, 8, 9]
Como podemos ver, os números foram organizados em ordem crescente. Para obter a ordem decrescente, basta definir `reverse=True`. Portanto, a linha 4 do exemplo anterior seria:
numeros_ordenados = sorted(numeros, reverse=True)
A saída com essa modificação seria:
[9, 8, 4, 3, 3, 2, 0]
Ordenando Listas de Strings
A função `sorted` não se limita a números. Ela também pode ordenar strings. Ao ordenar listas de strings, a comparação é feita com base nos valores ASCII dos caracteres. Por exemplo, ‘hello’ aparecerá antes de ‘world’ porque o valor ASCII de ‘h’ (104) é menor que o de ‘w’ (119).
Se as strings tiverem o mesmo primeiro caractere, os caracteres seguintes serão comparados até que a ordem possa ser definida. Veja este exemplo com nomes:
# Criando uma lista de nomes
lista_nomes = ['bob', 'dave', 'charlie', 'alice']
# Ordenando os nomes
nomes_ordenados = sorted(lista_nomes)
# Imprimindo os nomes ordenados
print(nomes_ordenados)
A saída será:
['alice', 'bob', 'charlie', 'dave']
Como a ordenação segue os valores ASCII, a posição das strings dependerá da ordem desses caracteres na tabela ASCII. Letras maiúsculas virão antes das minúsculas, por exemplo. Veja a tabela ASCII para referência:
Fonte: commons.wikimedia.org
Outros Iteráveis: Strings, Tuplas e Conjuntos
A função `sorted` funciona com diversos tipos de iteráveis. As mesmas regras de ordenação se aplicam a todos eles. Confira este exemplo:
# Imprimindo uma string ordenada
print(sorted("dijkstra"))
# Imprimindo uma tupla de valores ordenada
print(sorted((3, 4, 2, 1, 5, 0)))
# Imprimindo um conjunto de valores ordenado
print(sorted(set([4, 5, 5, 1, 3, 8, 9])))
A saída será:
['a', 'd', 'i', 'j', 'k', 'r', 's', 't']
[0, 1, 2, 3, 4, 5]
[1, 3, 4, 5, 8, 9]
Como você pode ver, em todos os casos, a saída é uma lista.
Ordenando Listas de Dicionários
A função `sorted` também pode ser usada para organizar listas de dicionários. No entanto, a ordenação de dicionários é um pouco mais complexa, pois um dicionário possui várias propriedades que podem ser usadas para comparação.
Portanto, ao ordenar dicionários, precisamos definir uma função que reduzirá cada dicionário a um valor que será usado na comparação. Essa função será passada para `sorted` como o argumento `key`. Veja o exemplo:
pessoas = [
{ 'nome': 'Alice', 'idade': 27 },
{ 'nome': 'Bob', 'idade': 23 },
{ 'nome': 'Charlie', 'idade': 25}
]
pessoas_ordenadas_por_idade = sorted(pessoas, key=lambda pessoa: pessoa['idade'])
print(pessoas_ordenadas_por_idade)
Neste exemplo, temos três pessoas representadas por dicionários, cada um com nome e idade. Queremos ordenar as pessoas por idade. Ao chamar a função `sorted`, passamos uma função como argumento `key`.
Essa função recebe um dicionário (uma pessoa) e retorna sua idade. O valor retornado é usado na ordenação. Assim, cada dicionário foi reduzido a um simples inteiro comparável. Aqui, usamos uma função lambda para simplificar a definição do argumento `key`.
A saída desse código será:
[{'nome': 'Bob', 'idade': 23}, {'nome': 'Charlie', 'idade': 25}, {'nome': 'Alice', 'idade': 27}]
Usando o Argumento `key`
O argumento `key` não se limita a dicionários. Ele pode ser usado com qualquer valor para definir um critério de ordenação. Veja outros exemplos:
- Ordenando valores com base no seu comprimento, definindo uma função `key` que recebe um valor e retorna seu comprimento.
- Ordenando strings ignorando diferenças entre maiúsculas e minúsculas, convertendo todas as strings para minúsculas na função `key`.
- Ordenando valores com base em um valor composto que combina dados de outras entradas.
Complexidade da Função `sorted`
A função `sorted` tem complexidade de tempo O(n log n), onde n é o número de elementos no iterável de entrada. Essa complexidade surge porque a função utiliza o algoritmo Timsort, que é um algoritmo híbrido de ordenação baseado em merge sort e insertion sort.
A complexidade espacial da função é O(n), onde n é o número de elementos na entrada. Isso ocorre porque uma nova lista é criada e retornada.
`sorted` vs. `sort`
Outra opção para organizar valores é a função `sort`. Nesta seção, exploraremos as principais diferenças entre `sorted` e `sort`.
- A função `sort` modifica o iterável original, enquanto `sorted` cria uma nova lista e a retorna.
- Como `sort` modifica o objeto original, a entrada deve ser uma lista. Já `sorted` pode receber qualquer iterável como entrada, que será usado para criar uma nova lista a ser retornada.
Conclusão
Neste artigo, exploramos a função `sorted` do Python, discutindo sua finalidade, como utilizá-la, seus argumentos e exemplos práticos. Também analisamos sua complexidade de tempo e a comparamos com a função `sort`.
Se você tiver interesse, pode ler nosso próximo artigo sobre a função `sum` do Python.