> Olá
>
> Preciso ordenar uma matriz pela segunda coluna. Por exemplo:
>
> l= [[2,6],[1,3],[5,4]]
>
> Deveria se tornar:
>
> l = [[1, 3], [5, 4], [2, 6]]
>
> Aqui [1], encontrei esta solução:
>
> li=[[2,6],[1,3],[5,4]]
> li.sort(lambda x, y: cmp(x[1],y[1]))
> print li; # prints [[1, 3], [5, 4], [2, 6]]
>
> Esta solução também funciona:
>
> sorted(x, key=lambda x: x[1])
>
> Qual a melhor entre as duas soluções? Alguma delas deveria ser
> evitada? Existe alguma outra solução, que poderia ser melhor que essas
> duas?
Vamos lá...
A decisão de usar lista.sort(...) ou sorted(...) é influenciada pela
sua decisão de querer
manter a lista original intacta. Se você usar o lista.sort(...), a
ordenação acontece na própria lista.
Quanto à duvida se você deve fazer cmp=.... ou key=...., veja o que diz o help:
"In general, the key and reverse conversion processes are much faster
than specifying an equivalent cmp function. This is because cmp is
called multiple times for each list element while key and reverse
touch each element only once."
Ou seja, a tua versão usando key=lambda x:x[1] é mais rápida.
Entretanto, você pode também fazer uso do módulo operator, que contém
diversas funcões implementadas em C e que, como o nome já diz, têm
alguma correspondência com os operadores do Python. Com isso você pode
ganhar um pouco mais de velocidade:
import operator
# sem alterar a lista
print sorted(lista, key=operator.itemgetter(1))
# alterando a lista
lista.sort(key=operator.itemgetter(1))
print lista
[]s
Roger