Solución:
Parece que estás un poco confundido por todas esas cosas.
operator
es un módulo incorporado que proporciona un conjunto de operadores convenientes. En dos palabras operator.itemgetter(n)
construye un invocable que asume un objeto iterable (por ejemplo, lista, tupla, conjunto) como entrada y extrae el n-ésimo elemento.
Entonces, no puedes usar key=a[x][1]
allí, porque Python no tiene idea de qué x
es. En su lugar, podría utilizar un lambda
función (elem
es solo un nombre de variable, no hay magia allí):
a.sort(key=lambda elem: elem[1])
O simplemente una función ordinaria:
def get_second_elem(iterable):
return iterable[1]
a.sort(key=get_second_elem)
Entonces, aquí hay una nota importante: en Python, las funciones son ciudadanos de primera clase, por lo que puede pasarlas a otras funciones como parámetro.
Otras preguntas:
- Sí, puede revertir la ordenación, solo agregue
reverse=True
:a.sort(key=..., reverse=True)
- Para ordenar por más de una columna, puede usar
itemgetter
con múltiples índices:operator.itemgetter(1,2)
, o con lambda:lambda elem: (elem[1], elem[2])
. De esta manera, los iterables se construyen sobre la marcha para cada elemento de la lista, que luego se comparan entre sí en orden lexicográfico (?) (Primeros elementos comparados, si son iguales, segundos elementos comparados, etc.) - Puede obtener valor en [3,2] utilizando
a[2,1]
(los índices están basados en cero). Usando el operador … Es posible, pero no tan limpio como simplemente indexar.
Consulte la documentación para obtener más detalles:
-
operator.itemgetter
explicado - Ordenar lista por clave personalizada en Python
Respuesta para principiantes de Python
En palabras más simples:
- los
key=
parámetro desort
requiere una llave función (que se aplicará a los objetos que se ordenarán) en lugar de una sola clave valor y - eso es justo lo que
operator.itemgetter(1)
te dará: A función que toma el primer elemento de un objeto similar a una lista.
(Más precisamente esos son llamables, no funciones, pero esa es una diferencia que a menudo se puede ignorar).
Estás haciendo muchas preguntas que podrías responder tú mismo leyendo la documentación, así que te daré un consejo general: léelo y experimenta en el shell de Python. Verás eso itemgetter
devuelve un invocable:
>>> func = operator.itemgetter(1)
>>> func(a)
['Paul', 22, 'Car Dealer']
>>> func(a[0])
8
Para hacerlo de otra manera, puedes usar lambda
:
a.sort(key=lambda x: x[1])
Y revertirlo:
a.sort(key=operator.itemgetter(1), reverse=True)
Ordenar por más de una columna:
a.sort(key=operator.itemgetter(1,2))
Consulte el Cómo ordenar.