Muy buenas, me llamo Miguel y hoy les traigo otro post.
Índice
Cómo ordenar listas, tuplas, cadenas y diccionarios en Python
En este tutorial, veremos cómo ordenar iterables, como listas, tuplas, cadenas y diccionarios, según diferentes criterios.
Ordenar una lista
Hay dos formas de ordenar una lista. Podemos usar el método sort()
o la función sorted()
. El método sort()
es un método de lista y, por lo tanto, solo se puede usar en listas. La función sorted()
funciona en cualquier iterable.
El método sort()
es un método de lista que modifica la lista en el lugar y devuelve None
. En otras palabras, el método sort()
modifica o cambia la lista en la que se llama y no crea una nueva lista.
Por defecto, el método sort()
ordenará una lista de números por sus valores y una lista de cadenas alfabéticamente. El parámetro inverso acepta un valor booleano de True
o False
.
El valor predeterminado para revertir es Falso
, lo que significa que se clasifica en orden ascendente. Para ordenar en orden descendente, establecerÃamos reverse = True
. Estos parámetros tendrán mucho más sentido si observamos algunos ejemplos a continuación.
Digamos que tenemos una lista de números y queremos ordenarla en orden ascendente.
num_list = [1,-5,3,-9,25,10] num_list.sort() print(num_list) # [-9,-5,1,3,10,25]
Entonces tenemos una lista de números, o num_list
. Llamamos al método sort()
en esta lista. Observe cómo no pasamos un valor para el parámetro clave. Por lo tanto, simplemente ordenó esta lista de números por sus valores reales.
Y como no establecimos reverse = True
, se ordenó en orden ascendente. El método sort()
modificó nuestra num_list
.
num_list = [1,-5,3,-9,25,10] def absolute_value(num): return abs(num) num_list.sort(key = absolute_value) print(num_list) # [1,3,-5,-9,10,25]
Definimos una función, valor_absoluto
, que toma un número y devuelve su valor absoluto. Luego pasamos esta función como argumento para el parámetro clave del método sort()
. Por lo tanto, ejecuta cada elemento o número de num_list
a través de la función de valor absoluto antes de realizar la comparación.
Como resultado, los valores absolutos de los números se utilizan para ordenar esta lista en orden ascendente (ya que reverse se establece en False
de forma predeterminada).
En su lugar, podrÃamos haber pasado una expresión lambda para el parámetro clave de la siguiente manera:
num_list.sort(key = lambda num: abs(num))
Recuerde que el método sort()
devuelve None
. Por lo tanto, si configuramos la salida, o el valor de retorno, del método sort()
a una nueva variable, obtenemos None
de la siguiente manera:
new_list = num_list.sort(key = absolute_value) print(new_list) # None
En lugar de escribir nuestra propia función valor_absoluto
como hicimos anteriormente, podrÃamos haber pasado la función abs()
incorporada en Python para el parámetro clave de la siguiente manera:
num_list.sort(key = abs)
La función sorted() puede aceptar tres parámetros: el iterable, la clave y el inverso. En otras palabras, el método sort()
solo funciona en listas, pero la función sorted()
puede funcionar en cualquier iterable, como listas, tuplas, diccionarios y otros.
Sin embargo, a diferencia del método sort()
que devuelve None
y modifica la lista original, la función sorted()
devuelve una nueva lista mientras deja el objeto original sin cambios.
Ordenemos num_list
nuevamente usando los valores absolutos pero usando la función sorted()
en su lugar:
num_list = [1,-5,3,-9,25,10] new_list = sorted(num_list, key = abs) print(new_list) # [1,3,-5,-9,10,25] print(num_list) # [1,-5,3,-9,25,10]
Pasamos el iterable, num_list
, a la función sorted()
, junto con la función abs incorporada al parámetro clave. Configuramos la salida de la función sorted()
a una nueva variable, new_list
.
Tenga en cuenta que num_list
no se modifica ya que la función sorted()
no modifica el iterable en el que actúa.
Nota: No importa qué iterable se pase a la función
sorted()
, siempre devuelve una lista.
Digamos que tenemos una lista de tuplas
. Cada elemento de la lista es una tupla que contiene tres elementos: el nombre, la edad y el salario.
list_of_tuples = [ ('john', 27, 45000), ('jane', 25, 65000), ('beth', 31, 70000) ]
Podemos ordenar esta lista alfabéticamente, por edad o por salario. Podemos especificar cuál queremos usar con el parámetro clave.
Para ordenar por edad, podemos utilizar el siguiente código:
sorted_age_list = sorted(list_of_tuples, key = lambda person: person[1]) print(sorted_age_list) # [('jane', 25, 65000), ('john', 27, 45000), ('beth', 31, 70000)]
Cada elemento de list_of_tuples
se pasa a la función lambda como parámetro de persona. Se devuelve el elemento en el Ãndice 1 de cada tupla. Ese es el valor que se usa para ordenar la lista, que es la edad.
Para ordenar el nombre alfabéticamente, podemos hacerlo sin pasar una clave en absoluto, ya que por defecto el primer elemento de cada tupla es lo que se compara (y recuerde, por defecto, las cadenas se ordenan alfabéticamente):
sorted_name_list = sorted(list_of_tuples) print(sorted_name_list) # [('beth', 31, 70000), ('jane', 25, 65000), ('john', 27, 45000)]
Sin embargo, podemos especificar que queremos ordenar por el primer elemento de cada tupla de la siguiente manera:
sorted_name_list = sorted(list_of_tuples, key = lambda person: person[0]) print(sorted_name_list) # [('beth', 31, 70000), ('jane', 25, 65000), ('john', 27, 45000)]
Recuerde que podemos asignar una expresión lambda a una variable (similar a usar la palabra clave def
para definir una función). Por lo tanto, podemos organizar las expresiones lambda en función de los criterios que utilizan para ordenar la lista:
name = lambda person: person[0] age = lambda person: person[1] salary = lambda person: person[2] # sort by name sorted(list_of_tuples, key = name) # sort by age sorted(list_of_tuples, key = age) # sort by salary sorted(list_of_tuples, key = salary)
En lugar de usar una expresión lambda para acceder a los elementos de nombre, edad o salario de las tuplas, podemos usar la función itemgetter()
que está disponible en el módulo del operador.
Podemos especificar a qué elemento acceder en la tupla pasando el Ãndice. Cada tupla de la lista se pasa a la función itemgetter()
, y el elemento especÃfico de esa tupla se devuelve según el Ãndice especificado.
import operator # sort by name sorted(list_of_tuples, key = operator.itemgetter(0)) # sort by age sorted(list_of_tuples, key = operator.itemgetter(1)) # sort by salary sorted(list_of_tuples, key = operator.itemgetter(2))
La función itemgetter()
permite múltiples niveles de clasificación. Por ejemplo, digamos que tenemos esta lista de tuplas en su lugar:
list_of_tuples = [ ('john', 27, 45000), ('jane', 25, 65000), ('joe', 25, 35000), ('beth', 31, 70000) ]
Observe cómo Jane y Joe tienen la misma edad. Entonces, si quisiéramos ordenar esta lista por edad primero, y segundo por salario, podemos pasar dos valores a la función itemgetter()
:
print(sorted(list_of_tuples, key=operator.itemgetter(1,2)) # [('joe', 25, 35000), ('jane', 25, 65000), ('john', 27, 45000), ('beth', 31, 70000)]
Dado que el Ãndice de edad es el primer valor que se pasa, se utilizará para ordenar los elementos primero. Si la edad es la misma, se utilizará salario para ordenar los elementos.
A tener en cuenta: El módulo de operador también tiene la función
attrgetter()
que se puede usar para ordenar objetos con atributos nombrados. Por ejemplo, si escribimos nuestra propia clase y instanciamos objetos de esa clase, podemos ordenar esos objetos usando un atributo con nombre especÃfico usando la funciónattrgetter()
.Simplemente pasarÃamos el nombre del atributo a la función
attrgetter()
y luego pasarÃamos esa función al parámetro clave de la funciónsorted()
. Por ejemplo, para ordenar los objetos por edad, pasarÃamos lo siguiente al parámetroclave: key = attrgetter ('edad')
.
Ordenar una tupla
Ordenar una tupla será lo mismo que ordenar una lista con la función sorted()
como se vio anteriormente. No podemos usar el método sort()
porque es un método de lista.
Además, dado que las tuplas son objetos inmutables, tendrÃa sentido que no podamos usar el método sort()
, ya que el método sort()
modifica la lista original.
Recuerde, incluso si pasamos una tupla a la función
sorted()
, se devuelve una lista.
num_tuple = (5,2,53,9,25) sorted_tuple = sorted(num_tuple) print(sorted_tuple) # [2,5,9,25,53]
Ordenar una cadena
Las cadenas son iterables. Por lo tanto, también se pueden ordenar usando la función sorted()
. La función sorted()
iterará sobre la cadena, carácter por carácter. Por defecto, la función sorted()
ordenará la cadena en orden alfabético.
sorted_string = sorted(‘dinosaur’) print(sorted_string) # ['a','d','i','n','o','r','s','u']
Observe cómo la función sorted()
devuelve una lista de los caracteres en orden alfabético.
Ordenar un diccionario
Los diccionarios se componen de pares clave: valor. Por lo tanto, se pueden ordenar por claves o por valores.Digamos que tenemos un diccionario, con las claves como nombres y los valores como edades.
dictionary_of_names = {'beth': 37, 'jane': 32, 'john': 41, 'mike': 59 }
Si pasamos todo el diccionario como iterable a la función sorted()
, obtendremos el siguiente resultado:
print(sorted(dictionary_of_names)) # ['beth', 'jane', 'john', 'mike']
Como podemos ver, si pasamos todo el diccionario como iterable a la función sorted()
, devuelve una lista que contiene solo las claves ordenadas alfabéticamente.
Si queremos obtener una copia ordenada de todo el diccionario, necesitamos usar el método items()
del diccionario:
print(dictionary_of_names.items()) # dict_items([('beth', 37), ('jane', 32), ('john', 41), ('mike', 59)])
Observe cómo el método items()
devuelve un objeto dict_items
, que se parece a una lista de tuplas. Este objeto dict_items
es iterable. Por lo tanto, se puede pasar como iterable a la función sorted()
.
Podemos ordenar este objeto dict_items
de la misma manera que ordenamos la lista de tuplas vista anteriormente. Por ejemplo, para ordenar por el segundo elemento de cada tupla, que serÃa la edad, podemos usar el siguiente código:
sorted_age = sorted(dictionary_of_names.items(), key = lambda kv: kv[1]) print(sorted_age) # [('jane', 32), ('beth', 37), ('john', 41), ('mike', 59)]
Observe cómo la función sorted()
devuelve una lista de tuplas, ordenadas por edad (o segundo elemento en cada tupla). Para convertir esta lista de tuplas en un diccionario, podemos usar la función incorporada dict()
:
sorted_dictionary = dict(sorted_age) print(sorted_dictionary) # {'jane': 32, 'beth': 37, 'john': 41, 'mike': 59}
¡Ahora tenemos un diccionario ordenado por edades!
En este tutorial, comparamos el método sort()
y la función sorted()
al ordenar una lista. Aprendimos cómo el método sort()
modifica la lista original y la función sorted()
devuelve una nueva lista.
También aprendimos que el método sort()
solo funciona en listas, pero la función sorted()
puede funcionar en cualquier iterable. Luego aprendimos cómo clasificar diferentes tipos de iterables y usar diferentes criterios.
Espero que te haya sido de utilidad. Gracias por leer este post.
Añadir comentario