Digamos que tengo una lista de puntos de un torneo
points = [0, 12, 9]Y quiero tener una clasificación de los jugadores, por lo que los resultados esperados serían
[1, 2, 0]Porque el índice 1 está primero en el ranking, seguido por el índice 2 y luego el índice 0. Mi idea era usar un for para iterar a través de todos los números, obtener el valor más grande, encontrar el índice del valor más grande y luego asignar el valor. en el ranking, pero me parece innecesariamente largo y complicado. ¿Algun consejo?
Uso sorted :
points = [0, 12, 9] res = sorted(range(len(points)), key=lambda x: points[x], reverse=True) print(res)Producción
[1, 2, 0] La idea es ordenar los índices de la lista ( range(3) ) según su valor en la lista, por lo tanto, key=lambda x: points[x] . El verdadero inverso es porque desea una clasificación descendente.
points = [0, 12, 9] points_and_indices = [(p, i) for i, p in enumerate(points)] points_and_indices.sort(reverse=True) indices = [i for p, i in points_and_indices] print(indices)producción:
[1, 2, 0]ACTUALIZAR
dices en un comentario
El primer índice que obtuvo esa cantidad de puntos está adelante
Desafortunadamente, esto hace que la solución anterior sea incorrecta para sus propósitos, porque los índices se incluyen en orden inverso.
Para explotar la estabilidad de las ordenaciones de Python, debemos no incluir los índices en la ordenación inversa o usar una función decreciente de los puntos en lugar de los puntos mismos.
Podemos clasificar según los puntos negativos y también condensarlo todo en una sola línea, como esta:
points = [0, 12, 9, 12] indices = [i for _, i in sorted((-p, i) for i, p in enumerate(points))] print(indices)producción:
[1, 3, 2, 0]De todos modos, la solución de Dani Mesejo es más pitónica, aunque el uso de una clave de clasificación puede causar algunos problemas a las personas que vienen de otros lenguajes de programación.