Compreendendo a função classificada em Python: um guia simples

Uma das grandes vantagens de usar o Python é sua simplicidade. É fácil trabalhar com ele porque sua biblioteca padrão possui muitas funções úteis. Uma dessas funções é a função classificada.

Esta função é usada para classificar iteráveis ​​por alguma ordem. Sem essa função, deve-se escrever código implementando um algoritmo de classificação, como Bubble Sort ou Insertion Sort. Isso geralmente é difícil, mas o Python fornece uma maneira mais simples, que abordaremos neste artigo.

Introdução à função classificada

A função sorted é uma função que classifica iteráveis ​​em Python. Um iterável é qualquer valor que você pode repetir. Exemplos de iteráveis ​​incluem strings, listas, tuplas e conjuntos. Esses iteráveis ​​geralmente não são ordenados e a classificação coloca seus valores em alguma ordem especificada. Ordenar valores é útil porque:

  • A pesquisa com valores é mais rápida e eficiente usando algoritmos como a pesquisa binária. No entanto, a pesquisa binária requer que os valores sejam classificados primeiro.
  • Para exibir valores. Às vezes, os usuários gostariam de visualizar as informações classificadas, por exemplo, o preço mais baixo primeiro ou a postagem mais recente primeiro. Isso exigiria a implementação de alguma forma de classificar uma lista de valores.
  • Ao realizar análises estatísticas, por exemplo, encontrar o valor que ocorre com mais frequência em um conjunto. É mais fácil fazer isso quando os valores são classificados em ordem.

Guia de uso da função classificada

Como mencionado anteriormente, a função classificada funciona com todos os iteráveis. Por sua vez, ele retorna uma lista que foi classificada. Isso é importante observar – embora a entrada possa ser iterável, o valor de retorno deve sempre ser uma lista.

Sintaxe da Função Ordenada

A assinatura da função ordenada é a seguinte:

sorted(iterable, key=None, reverse=False)

Como você pode ver, o único argumento necessário é o iterável, que será classificado.

O seguinte argumento é a chave. A chave é uma função que será utilizada para transformar cada elemento no iterável para obter um valor que será utilizado para ordenação. Isso será útil para classificar uma lista de dicionários, como você verá mais adiante. O valor padrão é nenhum, portanto, não aplicará nenhuma função, a menos que seja especificado.

O último argumento é o argumento inverso. Quando definido como verdadeiro, os itens serão classificados na ordem inversa.

Na próxima seção, usarei exemplos para demonstrar como usar a função.

Exemplos de uso de funções classificadas

Lista de Números

O caso mais simples de classificação de valores é a classificação de uma lista de números. Considere o seguinte exemplo de código:

# A list of unsorted values
numbers = [8, 4, 3, 9, 2, 0, 3]

# Sorting the numbers
sorted_numbers = sorted(numbers)

# Outputting the sorted values
print(sorted_numbers)

A saída seria:

[0, 2, 3, 3, 4, 8, 9]

Como você pode ver, os valores foram classificados em ordem crescente. Você definiria reverse como true se quisesse classificá-los em ordem decrescente. Portanto, a linha 4 no exemplo de código anterior seria:

sorted_numbers = sorted(numbers, reverse=True)

A saída da execução do programa modificado seria:

[9, 8, 4, 3, 3, 2, 0]

Lista de Strings

A função classificada suporta mais do que apenas números. Você também pode classificar strings. Para classificar strings em uma lista, os primeiros caracteres das strings são comparados. As comparações são realizadas nos valores ASCII dos caracteres. Por exemplo, ‘hello’ viria antes da palavra ‘world’ porque o valor ASCII de ‘h’ é 104, menor que o valor ASCII de ‘w’, 119.

Se uma ou mais strings tiverem o mesmo primeiro caractere, seu segundo caractere e os subsequentes serão comparados até que alguma ordem seja encontrada. Aqui está um exemplo de código onde classificamos os nomes das pessoas.

# Creating a list of names
members_list = ['bob', 'dave', 'charlie', 'alice']

# Sorting the names
sorted_members_list = sorted(members_list)

# Printing the names
print(sorted_members_list)

Isso produzirá a seguinte saída:

['alice', 'bob', 'charlie', 'dave']

Como os valores ASCII são usados, a ordem das strings depende de qual caractere vem primeiro na tabela ASCII. Por exemplo, um caractere maiúsculo viria antes de um minúsculo porque os caracteres maiúsculos vêm antes de letras minúsculas em ASCII. Aqui está uma tabela ASCII completa para sua referência:

Fonte: commons.wikimedia.org

Outros iteráveis ​​– strings, tuplas e conjuntos

Como mencionei, a função sorted funciona com todos os tipos de iteráveis. As mesmas regras se aplicam a como os valores nos iteráveis ​​serão classificados. Aqui está um exemplo:

# Printing a sorted string
print(sorted("dijkstra"))

# Printing a sorted tuple of values
print(sorted((3, 4, 2, 1, 5, 0)))

# Printing a sorted set of values
print(sorted(set([4, 5, 5, 1, 3, 8, 9])))

A saída disso 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, a saída em cada caso é uma lista.

Lista de dicionários

Você também pode aplicar a função classificada para classificar uma lista de dicionários. No entanto, classificar dicionários é um pouco mais complicado. Isso ocorre porque, ao contrário de números ou strings, um dicionário tem várias propriedades, cada uma igualmente válida para comparação.

Portanto, para classificar dicionários, você especifica uma função que resumirá todo o dicionário a um valor que será usado para comparação. Esta função será passada para a função classificada como o argumento chave. Segue um exemplo para ilustrar:

people = [
        { 'name': 'Alice', 'age': 27 },
        { 'name': 'Bob', 'age':  23 },
        { 'name': 'Charlie', 'age': 25}
]

people_sorted_by_age = sorted(people, key=lambda person: person['age'])
print(people_sorted_by_age)

Neste exemplo, temos três pessoas representadas por um objeto dicionário. Cada objeto tem um atributo de nome e idade. Queremos classificar as pessoas por idade. Portanto, quando chamamos a função classificada, passamos uma função como argumento-chave.

Essa função receberá o objeto de dicionário de uma pessoa e retornará a idade da pessoa. O valor de retorno dessa chave será usado para classificação. Portanto, todo o dicionário foi resumido em um inteiro simples que pode ser comparado. Para simplificar, usei uma função lambda para definir o argumento chave.

A execução do código produzirá a seguinte saída:

[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]

Caso de uso de argumento-chave

O argumento chave não precisa ser usado apenas ao classificar dicionários. Você pode usá-lo em todos os valores. Seu uso é fornecer uma chave que pode ser usada para classificar valores. Aqui estão exemplos de casos de uso:

  • Classificando valores por meio da definição de uma função-chave que recebe o valor e retorna o comprimento do valor.
  • Classificando strings em uma lista sem diferenciar maiúsculas de minúsculas. Para fazer isso, cada string na lista pode ser convertida em letras minúsculas. Isso pode ser obtido definindo uma função-chave que recebe o valor-chave de uma string e retorna uma versão em letras minúsculas da string.
  • Classificando valores com base em um valor composto que combina os valores de outras entradas.

Complexidade de tempo de execução da função classificada

A função classificada tem uma complexidade de tempo de execução de O(n log n), onde n é o número de elementos na entrada iterável. Essa complexidade surge porque a função usa o algoritmo Timsort, que é um algoritmo de classificação híbrido baseado em classificação por mesclagem e classificação por inserção.

A complexidade espacial da função é O(n), onde n ainda é o número de elementos na entrada. Isso ocorre porque uma nova lista é criada e retornada.

Função Ordenada vs. Função Ordenar

Outra opção para classificar valores é a função de classificação. Esta seção explicará as principais diferenças entre as funções sorted e sort.

  • A função sort modifica o iterável no local, enquanto a função sorted cria uma nova lista e a retorna.
  • Como as modificações são realizadas no local, sort requer que a entrada seja uma lista. Por outro lado, sorted pode receber qualquer iterável como entrada, que será usado para criar uma nova lista que será modificada e retornada.

Palavras Finais

Neste artigo, abordamos a função sorted – o que é, como usá-la e os diferentes argumentos que ela contém. Também abordamos diferentes exemplos de uso da função e sua complexidade de tempo de execução e a comparamos com a função sort.

Em seguida, você pode querer ler nosso artigo sobre a função Sum do Python.