为什么Python的list.sort会发生这种情况?

时间:2009-12-29 06:09:49

标签: python

鉴于代码:

a=['a','b','c','d']
b=a[::-1]
print b
c=zip(a,b)
print c
c.sort(key=lambda x:x[1])#
print c

打印:

['d', 'c', 'b', 'a']
[('a', 'd'), ('b', 'c'), ('c', 'b'), ('d', 'a')]
[('d', 'a'), ('c', 'b'), ('b', 'c'), ('a', 'd')]

为什么[('a','d'),('b','c'),('c','b'),('d','a')]变为[( 'd','a'),('c','b'),('b','c'),('a','d')]?


同样,给定:

c.sort(key=lambda x:3)#
print c

打印:

[('a', 'd'), ('b', 'c'), ('c', 'b'), ('d', 'a')]

没有什么变化 - 为什么?

5 个答案:

答案 0 :(得分:7)

因为x [1]表示 second

使用

c.sort(key=lambda x:x[0])

答案 1 :(得分:4)

您已使用第二项作为键对c进行了排序,而第二项确实上升了,就像您要求它上升一样。什么令人惊讶?!

答案 2 :(得分:1)

from operator import itemgetter    
c.sort(key=itemgetter(0))

答案 3 :(得分:1)

正如其他人所说,[1]指的是第二个元素,因此第一部分中的元素按此方式排序。

至于第二部分,list.sort()stable,因此评估相同键的元素将保持它们在序列中的相对位置。这就是为什么使用.sort(reverse=True)可以提供.sort()后跟.reverse()的不同结果。

答案 4 :(得分:0)

您已使用每个元组的第二个元素作为键对列表进行排序,因此您可以获得按其第二个元素排序的元组(注意'a','b','c','d'按升序排列)。有什么问题?