¿Qué argumentos tiene la función sort () de Python?

¿Hay algún otro argumento que no sea key , por ejemplo: value ?

Argumentos de sort y sort

Tanto los sorted como los sorted tienen tres argumentos de palabras clave: cmp , key e reverse .

 L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; cmp(x, y) -> -1, 0, 1 sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list 

Es preferible usar key y reverse , porque funcionan mucho más rápido que un cmp equivalente.

key debe ser una función que toma un elemento y devuelve un valor para comparar y ordenar. reverse permite invertir el orden de clasificación.

Usando argumento key

Puede usar operator.itemgetter como un argumento clave para ordenar por segundo, tercer elemento, etc. en una tupla.

Ejemplo

 >>> from operator import itemgetter >>> a = range(5) >>> b = a[::-1] >>> c = map(lambda x: chr(((x+3)%5)+97), a) >>> sequence = zip(a,b,c) # sort by first item in a tuple >>> sorted(sequence, key = itemgetter(0)) [(0, 4, 'd'), (1, 3, 'e'), (2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c')] # sort by second item in a tuple >>> sorted(sequence, key = itemgetter(1)) [(4, 0, 'c'), (3, 1, 'b'), (2, 2, 'a'), (1, 3, 'e'), (0, 4, 'd')] # sort by third item in a tuple >>> sorted(sequence, key = itemgetter(2)) [(2, 2, 'a'), (3, 1, 'b'), (4, 0, 'c'), (0, 4, 'd'), (1, 3, 'e')] 

Explicación

Las secuencias pueden contener cualquier objeto, ni siquiera comparable, pero si podemos definir una función que produzca algo que podamos comparar para cada uno de los elementos, podemos pasar esta función en key argumento key para sort o sorted .

itemgetter , en particular, crea una función tal que recupera el elemento dado de su operando. Un ejemplo de su documentación:

Después, f=itemgetter(2) , la llamada f(r) devuelve r[2] .

Mini-benchmark, key vs cmp

Solo por curiosidad, en comparación con el rendimiento de la key y el cmp , más pequeño es mejor:

 >>> from timeit import Timer >>> Timer(stmt="sorted(xs,key=itemgetter(1))",setup="from operator import itemgetter;xs=range(100);xs=zip(xs,xs);").timeit(300000) 6.7079150676727295 >>> Timer(stmt="sorted(xs,key=lambda x:x[1])",setup="xs=range(100);xs=zip(xs,xs);").timeit(300000) 11.609490871429443 >>> Timer(stmt="sorted(xs,cmp=lambda a,b: cmp(a[1],b[1]))",setup="xs=range(100);xs=zip(xs,xs);").timeit(300000) 22.335839986801147 

Por lo tanto, la clasificación con key parece ser al menos el doble de rápida que la clasificación con cmp . El uso de itemgetter lugar de lambda x: x[1] hace que la clasificación sea aún más rápida.

Además de key= , el método de clasificación de listas en Python 2.x podría tomar alternativamente un argumento cmp= ( no es una buena idea, se eliminó en Python 3); con cualquiera o con ninguno de estos dos, siempre puede pasar reverse=True para que el ordenamiento vaya hacia abajo (en lugar de hacia arriba, como es el predeterminado, y que también puede solicitar explícitamente con reverse=False si realmente desea hacerlo) por alguna razón). No tengo idea de lo que se supone que debe hacer ese argumento de value que está mencionando.

Sí, toma otros argumentos, pero ningún value .

 >>> print list.sort.__doc__ L.sort(cmp=None, key=None, reverse=False) -- stable sort *IN PLACE*; cmp(x, y) -> -1, 0, 1 

¿Qué significaría un argumento de value ?