Diferencia entre sort() y sorted() en Python
La ordenación es un tema muy importante en el mundo de la informática. Hay muchos algoritmos disponibles para ordenar matrices de datos, como la clasificación por fusión, la clasificación rápida, la clasificación por burbujas, la clasificación por selección, la clasificación por inserción, etc. Todos estos algoritmos tienen diferentes complejidades de tiempo y espacio, pero la combinación y la rápida generalmente se consideran los mejores. Dado que la clasificación es una operación muy común, los lenguajes de programación contienen funciones integradas para clasificar los datos. Y Python es uno de ellos.
Pero, hay dos funciones para ordenar en Python, a saber, sort
y sorted
. En este artículo, aprenderemos sobre la diferencia entre estas dos funciones de clasificación.
La función sort()
en Python
La función sort
en Python ordena la lista en su lugar intercambiando los valores en los índices. Cuando llamamos a la función sort
sobre una lista, no se devuelve una nueva lista; más bien, se ordena la misma lista. La función sort
se puede utilizar para ordenar listas.
Consulte el siguiente código para ver un ejemplo.
myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort()
print(myList)
Producción :
[1, 5, 2, 10, 33, 3, 9]
[1, 2, 3, 5, 9, 10, 33]
Como podemos ver, la misma lista se ordenó cuando llamamos a la función sort
sobre ella.
Si deseamos ordenar la lista en orden inverso, también podemos hacerlo estableciendo el argumento reverse
en True
.
Consulte el siguiente código para el mismo.
myList = [1, 5, 2, 10, 33, 3, 9]
print(myList)
myList.sort(reverse=True)
print(myList)
Producción :
[1, 5, 2, 10, 33, 3, 9]
[33, 10, 9, 5, 3, 2, 1]
La función sort
tiene otro parámetro, a saber, key
, que se puede utilizar para definir qué valor considerar para la ordenación. Por ejemplo, si tenemos una lista de pares y deseamos ordenar los pares considerando el segundo valor, podemos hacerlo usando el parámetro key
.
Consulte el siguiente código para ver un ejemplo.
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)
Producción :
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, la lista se ordena según el segundo número dentro de los pares.
También podemos ordenar una lista de diccionarios usando el mismo enfoque. Consulte el siguiente código para el mismo.
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)
Producción :
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, las entradas dentro de la lista de diccionarios se ordenan según la clave que definimos.
La función sorted()
en Python
Al igual que la función sort
, sorted
también se utiliza para ordenar listas. Pero, la función sorted
devuelve una nueva lista en lugar de ordenar la misma lista en su lugar. Ésta es la principal diferencia entre las dos funciones. Entendamos esto con un ejemplo.
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)
Producción :
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, la lista que pasamos a la función sorted
permanece igual, y se devolvió una nueva lista, que se almacena dentro de la variable newList
. Los dos parámetros, a saber, reverse
y key
, también están disponibles en esta función. Usando los dos, podemos obtener una lista ordenada en orden inverso y ordenar la lista según una clave personalizada. Los siguientes ejemplos representan lo mismo.
Ejemplo para el 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)
Producción :
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]
Y, un ejemplo para el parámetro key
.
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)
Producción :
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}]