Diferença entre sort() e sorted() em Python
A classificação é um tema muito importante no mundo da informática. Existem muitos algoritmos disponíveis para ordenar matrizes de dados, como mesclar ordenação, ordenação rápida, ordenação de bolha, ordenação de seleção, ordenação de inserção, etc. Todos esses algoritmos têm diferentes complexidades de tempo e espaço, mas merge e rápido são geralmente considerados os melhores. Como a classificação é uma operação muito comum, as linguagens de programação contêm funções integradas para classificar os dados. E Python é um deles.
Mas, existem duas funções para ordenar em Python, a saber, sort
e sorted
. Neste artigo, aprenderemos sobre a diferença entre essas duas funções de classificação.
a função sort()
em Python
A função sort
em Python ordena a lista no lugar, trocando os valores em seus índices. Quando chamamos a função sort
em uma lista, uma nova lista não é retornada; em vez disso, a mesma lista é classificada. A função sort()
pode ser usada para ordenar listas.
Consulte o código a seguir para obter um exemplo.
myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort()
print(myList)
Resultado:
[1, 5, 2, 10, 33, 3, 9]
[1, 2, 3, 5, 9, 10, 33]
Como podemos ver, a mesma lista foi classificada quando chamamos a função sort
sobre ela.
Se desejarmos classificar a lista na ordem reversa, também podemos fazer isso definindo o argumento reverse
para True
.
Consulte o seguinte código para o mesmo.
myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort(reverse=True)
print(myList)
Resultado:
[1, 5, 2, 10, 33, 3, 9]
[33, 10, 9, 5, 3, 2, 1]
A função sort
possui ainda outro parâmetro, nomeadamente, key
, que pode ser utilizado para definir o valor a considerar para ordenação. Por exemplo, se tivermos uma lista de pares e desejarmos classificar os pares considerando o segundo valor, podemos fazer isso usando o parâmetro key
.
Consulte o código a seguir para obter um exemplo.
def secondElement(element):
return element[1]
data = [(1, 2), (3, 4), (5, 3), (6, 6), (3, 0), (10, 1)]
print("Before sorting:", data)
data.sort(key=secondElement)
print("After sorting:", data)
Resultado:
Before sorting: [(1, 2), (3, 4), (5, 3), (6, 6), (3, 0), (10, 1)]
After sorting: [(3, 0), (10, 1), (1, 2), (5, 3), (3, 4), (6, 6)]
Como podemos ver, a lista é classificada com base no segundo número dentro dos pares.
Também podemos classificar uma lista de dicionários usando a mesma abordagem. Consulte o seguinte código para o mesmo.
def byName(entry):
return entry["name"]
def byAge(entry):
return entry["age"]
def byRank(entry):
return entry["rank"]
data = [
{
"name": "Vaibhav",
"age": 18,
"rank": 1,
},
{
"name": "Steve",
"age": 24,
"rank": 5,
},
{
"name": "Olive",
"age": 12,
"rank": 2,
},
{
"name": "Allison",
"age": 17,
"rank": 4,
},
]
print("Original Data")
print(data)
print("Sorted by Name")
data.sort(key=byName)
print(data)
print("Sorted by Age")
data.sort(key=byAge)
print(data)
print("Sorted by Rank")
data.sort(key=byRank)
print(data)
Resultado:
Original Data
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Como podemos ver, as entradas dentro da lista de dicionários são classificadas com base na chave que definimos.
a função sorted()
em Python
Como a função sort
, sorted
também é usado para ordenar listas. Mas, a função sorted
retorna uma nova lista em vez de classificar a mesma lista no local. Esta é a principal diferença entre as duas funções. Vamos entender isso com um exemplo.
myList = [1, 5, 2, 10, 33, 3, 9]
print("Before called sorted():", myList)
newList = sorted(myList)
print("After called sorted():", myList)
print("New list:", newList)
Resultado:
Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [1, 2, 3, 5, 9, 10, 33]
Como podemos ver, a lista que passamos para a função sorted
permanece a mesma, e uma nova lista foi retornada, que é armazenada dentro da variável newList
. Os dois parâmetros, nomeadamente reverse
e key
, também estão disponíveis nesta função. Usando os dois, podemos obter uma lista classificada na ordem inversa e classificar a lista com base em uma chave personalizada. Os exemplos a seguir mostram o mesmo.
Exemplo para o parâmetro reverso
.
myList = [1, 5, 2, 10, 33, 3, 9]
print("Before called sorted():", myList)
newList = sorted(myList, reverse=True)
print("After called sorted():", myList)
print("New list:", newList)
Resultado:
Before called sorted(): [1, 5, 2, 10, 33, 3, 9]
After called sorted(): [1, 5, 2, 10, 33, 3, 9]
New list: [33, 10, 9, 5, 3, 2, 1]
E, um exemplo para o parâmetro chave
.
def byName(entry):
return entry["name"]
def byAge(entry):
return entry["age"]
def byRank(entry):
return entry["rank"]
data = [
{
"name": "Vaibhav",
"age": 18,
"rank": 1,
},
{
"name": "Steve",
"age": 24,
"rank": 5,
},
{
"name": "Olive",
"age": 12,
"rank": 2,
},
{
"name": "Allison",
"age": 17,
"rank": 4,
},
]
print("Original Data")
print(data)
print("Sorted by Name")
nameSorted = sorted(data, key=byName)
print(nameSorted)
print("Sorted by Age")
ageSorted = sorted(data, key=byAge)
print(ageSorted)
print("Sorted by Rank")
rankSorted = sorted(data, key=byRank)
print(rankSorted)
print("Data after all operations")
print(data)
Resultado:
Original Data
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]
Sorted by Name
[{'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}]
Sorted by Age
[{'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Sorted by Rank
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}, {'name': 'Steve', 'age': 24, 'rank': 5}]
Data after all operations
[{'name': 'Vaibhav', 'age': 18, 'rank': 1}, {'name': 'Steve', 'age': 24, 'rank': 5}, {'name': 'Olive', 'age': 12, 'rank': 2}, {'name': 'Allison', 'age': 17, 'rank': 4}]