Saltar al contenido

¿Cómo funcionan operator.itemgetter () y sort ()?

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:

  1. Sí, puede revertir la ordenación, solo agregue reverse=True: a.sort(key=..., reverse=True)
  2. 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.)
  3. 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:

  1. operator.itemgetter explicado
  2. Ordenar lista por clave personalizada en Python

Respuesta para principiantes de Python

En palabras más simples:

  1. los key= parámetro de sort requiere una llave función (que se aplicará a los objetos que se ordenarán) en lugar de una sola clave valor y
  2. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *