为什么Python的list.sort会出现这种情况?

3

给定以下代码:

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')]

为什么没有任何变化?


有点难以确定你在哪些方面遇到了Python的问题。列表?Lambda表达式?例如,你理解"lambda x:3"是什么意思吗?或者x[1]? - Alice Purcell
5个回答

7
因为 x[1] 表示“第二个”,请注意。
使用
c.sort(key=lambda x:x[0])

3
你已经使用第二项作为关键字对 c 进行了排序,而且第二项确实上升了,就像你要求的那样。这有什么惊奇的?!

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

1

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

至于第二部分,list.sort()稳定的,因此评估为相同键的元素将保持它们在序列中的相对位置。这就是为什么使用 .sort(reverse=True) 可能会与先使用 .sort() 再使用 .reverse() 得到不同的结果。


0

你已经使用每个元组的第二个元素作为键对列表进行了排序,因此你得到了按照它们的第二个元素排序的元组(注意 'a'、'b'、'c'、'd' 是按照递增顺序排列的)。问题出在哪里?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接