Tengo una lista de diccionarios y quiero que cada elemento se ordene por valores de propiedad específicos.
Tenga en cuenta la matriz a continuación,
[{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
Cuando se ordena por name
, debe convertirse
[{'name':'Bart', 'age':10}, {'name':'Homer', 'age':39}]
[{'name':'Bart', 'age':10, 'note':3},{'name':'Homer','age':10,'note':2},{'name':'Vasile','age':20,'note':3}]
ya utilizar:from operator import itemgetter newlist = sorted(old_list, key=itemgetter(-'note','name')
EDIT: Probado, y está funcionando pero no sabemos cómo hacer nota DESC ASC y el nombre.Respuestas:
Puede verse más limpio usando una tecla en lugar de un cmp:
o como JFSebastian y otros sugirieron,
Para completar (como se señala en los comentarios de fitzgeraldsteele), agregue
reverse=True
para ordenar descendentefuente
itemgetter(i)
wherei
es el índice del elemento de tupla para ordenar.itemgetter
acepta más de un argumento:itemgetter(1,2,3)
es una función que devuelve una tuplaobj[1], obj[2], obj[3]
, por lo que puede usarla para hacer tipos complejos.Para ordenar la lista de diccionarios por clave = 'nombre':
Para ordenar la lista de diccionarios por clave = 'edad':
fuente
key=lambda k: (k['name'], k['age'])
. (okey=itemgetter('name', 'age')
) las tuplascmp
compararán cada elemento por turno. Es sangrientamente brillante.key
argumento opcional paralist.sort()
. ¿Alguna idea de dónde encontrar eso?list
amigos.my_list
ahora será lo que quieras.(3 años después) Editado para agregar:
El nuevo
key
argumento es más eficiente y ordenado. Una mejor respuesta ahora se ve así:... la lambda es, en mi opinión, más fácil de entender que
operator.itemgetter
, pero YMMV.fuente
Si desea ordenar la lista por varias claves, puede hacer lo siguiente:
Es bastante hack, ya que se basa en convertir los valores en una representación de cadena única para la comparación, pero funciona como se espera para los números, incluidos los negativos (aunque necesitará formatear su cadena de manera apropiada con rellenos de cero si está usando números)
fuente
'clave' se utiliza para ordenar por un valor arbitrario y 'itemgetter' establece ese valor en el atributo 'nombre' de cada elemento.
fuente
fuente
Supongo que has querido decir:
Esto se ordenaría así:
fuente
Puede usar una función de comparación personalizada o puede pasar una función que calcule una clave de clasificación personalizada. Eso suele ser más eficiente ya que la clave solo se calcula una vez por elemento, mientras que la función de comparación se llamaría muchas veces más.
Podrías hacerlo de esta manera:
Pero la biblioteca estándar contiene una rutina genérica para conseguir artículos de objetos arbitrarios:
itemgetter
. Intenta esto en su lugar:fuente
Usando la transformación Schwartzian de Perl,
hacer
da
Más información sobre la transformación de Perl Schwartzian
fuente
key=
de.sort
desde 2,4, que es el año 2004, no transformar el Schwartzian dentro del código de clasificación, en C; por lo tanto, este método es útil solo en Pythons 2.0-2.3. todos los cuales tienen más de 12 años.Debe implementar su propia función de comparación que comparará los diccionarios por valores de claves de nombre. Ver Ordenar Mini-CÓMO DE PythonInfo Wiki
fuente
alguna vez necesitamos usar
lower()
por ejemplofuente
Aquí está la solución general alternativa: clasifica los elementos de dict por claves y valores. La ventaja de esto es que no es necesario especificar claves, y aún funcionaría si faltan algunas claves en algunos diccionarios.
fuente
Usar el paquete pandas es otro método, aunque su tiempo de ejecución a gran escala es mucho más lento que los métodos más tradicionales propuestos por otros:
Aquí hay algunos valores de referencia para una lista pequeña y una lista grande (más de 100k) de dictados:
fuente
Si no necesita el original
list
dedictionaries
, puede modificarlo en el lugar con elsort()
método utilizando una función de tecla personalizada.Función de la tecla:
El
list
para ser clasificado:Clasificándolo en el lugar:
Si necesita el original
list
, llame a lasorted()
función pasándole la funciónlist
y la tecla, luego asigne el ordenado devueltolist
a una nueva variable:Imprenta
data_one
ynew_data
.fuente
Digamos que tengo un diccionario
D
con los siguientes elementos. Para ordenar, simplemente use el argumento clave en ordenado para pasar la función personalizada como se muestra a continuación:Mira esto .
fuente
He sido un gran fanático del filtro con lambda, sin embargo, no es la mejor opción si considera la complejidad del tiempo
Primera opción
Segunda opción
Comparación rápida de tiempos ejecutivos
fuente
Si el rendimiento es una preocupación, lo usaría en
operator.itemgetter
lugar de hacerlo,lambda
ya que las funciones integradas funcionan más rápido que las funciones hechas a mano. Laitemgetter
función parece funcionar aproximadamente un 20% más rápido quelambda
según mis pruebas.Desde https://wiki.python.org/moin/PythonSpeed :
He aquí una comparación de la clasificación de velocidad por medio
lambda
vsitemgetter
.Ambas técnicas ordenan la lista en el mismo orden (verificado mediante la ejecución de la declaración final en el bloque de código), pero una es un poco más rápida.
fuente
Puedes usar el siguiente código
fuente