ylab color change categoryorder python algorithm sorting python-3.x

python - color - plotly layout



Clasificación de Python 3: comparador personalizado eliminado a favor de la clave, ¿por qué? (2)

En Python 2.4, puede pasar un comparador personalizado para ordenar.

Tomemos la lista -

list=[5,1,2,3,6,0,7,1,4]

Para ordenar primero los números pares y luego las probabilidades, podemos hacer lo siguiente:

evenfirst=lambda x,y:1 if x%2>y%2 else -1 if y%2>x%2 else x-y list.sort(cmp=evenfirst) list == [0, 2, 4, 6, 1, 1, 3, 5, 7] # True

En Python 3, solo puede pasar la key (que también es compatible con Python 2.4).

Por supuesto, la misma clasificación se puede lograr en Python 3 con la key correcta:

list.sort(key=lambda x:[x%2,x])

Tengo curiosidad sobre la decisión de no apoyar a los comparadores personalizados más, especialmente cuando parece algo que podría implementarse con la suficiente facilidad.

¿Es verdad que en todos, o en la mayoría de los casos, un orden de clasificación deseado tiene una key natural?

En el ejemplo anterior, por ejemplo, tal clave existe, y en realidad el código se vuelve más sucinto al usarla. ¿Es siempre el caso?

(Estoy al tanto de esta receta para convertir el comparador en clave, pero idealmente, uno no debería tener que tomar tales soluciones si pudiera integrarse en el lenguaje).


Actuación.

La función cmp se llamó cada vez que el algoritmo de clasificación necesitaba una comparación entre dos elementos.

Por el contrario, el objeto key se puede almacenar en caché . Es decir, el algoritmo de clasificación solo necesita obtener la clave una vez para cada elemento y luego comparar las claves. No necesita obtener una nueva clave para cada comparación.


La clasificación por claves está bien definida, lo que significa que el resultado no depende del algoritmo de clasificación (estable) que utilice. No hay una función de clave patológica. Puede sugerir random.random() , pero eso simplemente mezcla la lista.

Mientras que la ordenación con una función de comparación está bien definida solo si la función es transitiva y antisimétrica, lo que Python no puede probar ni probar. ¿Qué sucede si clasificas por la función de comparación sin sentido lambda(x, y): 1 ? No se puede decir, el resultado depende del algoritmo. Algunos algoritmos podrían incluso no terminar.