Python排序函数
有人能解释为什么下面的lambda排序返回这个结果吗 例1 例2 我了解正常的student.age acs排序是如何工作的,但不了解上面的示例Python排序函数,python,Python,有人能解释为什么下面的lambda排序返回这个结果吗 例1 例2 我了解正常的student.age acs排序是如何工作的,但不了解上面的示例 >>student_objects = [ Student('john', 'A', 15), Student('jane', 'B', 12), Student('dave', 'B', 10), ] >> sorted(student_objects, key=lambda s
>>student_objects = [
Student('john', 'A', 15),
Student('jane', 'B', 12),
Student('dave', 'B', 10),
]
>> sorted(student_objects, key=lambda student: student.age) # sort by age
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
键
表示“不是按每个位置的实际值排序,而是计算一个新值,按该值排序,然后将原始值放在新值将在列表中排序的位置”
因此,从原始列表开始:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
为每个项目调用键lambda,创建以下键值(在参数中):
然后按照键值的顺序对列表进行排序:
[5 (0),
4 (1),
6 (1),
7 (2),
3 (2),
2 (3),
8 (3),
1 (4),
9 (4)]
然后,列表中的原始值按该顺序返回:
[5, 4, 6, 3, 7, 2, 8, 1, 9]
key函数返回排序所依据的值。如果您想了解abs(5-x)对排序的影响,请计算给定列表的值:
>>> values = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> key = lambda x: abs(5 - x)
>>> [(v, key(v)) for v in values]
[(1, 4), (2, 3), (3, 2), (4, 1), (5, 0), (6, 1), (7, 2), (8, 3), (9, 4)]
因此,sorted()
将按键值排序的顺序放置列表。对于5
,键返回0
,这是最低的值,并且会排在第一位。对于1
和9
,键返回4
,然后这些键最后排序。只要按键产生相等的值(如输入值2
和8
的3
),输入将保持其原始顺序:
>>> sorted([(v, key(v)) for v in values], key=lambda vk: vk[1]) # sort on the key output
[(5, 0), (4, 1), (6, 1), (3, 2), (7, 2), (2, 3), (8, 3), (1, 4), (9, 4)]
>>> #^ ^ ^ ^ ^ ^ ^ ^ ^
然后返回的是原始输入值,没有排序键的输出
最后,该键使值按距离
5
排序。最接近5的值排在第一位,距离最远的值排在最后。“最后,键使值按距离5排序。最接近5的值排在第一位,距离最远的值排在最后。”最接近的值排在第一位是什么意思,python如何判断?因为num 9和num 1都有相同的间距(4)5@Tyler:我确实报道过:他们的输入顺序保持不变。所以4
排在6
之前,1
排在9
之前,只是因为这是它们在输入列表中的顺序。@Tyler:换句话说,如果你先颠倒输入列表,那么你会得到9
排在1
之前,因为当按键同时为这两个输入生成4
时,无法区分这两个输入<代码>[9,8,7,6,5,4,3,2,1]用同一个键排序会产生[5,6,4,7,3,8,2,9,1]
。谢谢,琥珀色的答案很好,但必须承认你的最后两句话和(reverse=True)示例拯救了我的一天
[5, 4, 6, 3, 7, 2, 8, 1, 9]
>>> values = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> key = lambda x: abs(5 - x)
>>> [(v, key(v)) for v in values]
[(1, 4), (2, 3), (3, 2), (4, 1), (5, 0), (6, 1), (7, 2), (8, 3), (9, 4)]
>>> sorted([(v, key(v)) for v in values], key=lambda vk: vk[1]) # sort on the key output
[(5, 0), (4, 1), (6, 1), (3, 2), (7, 2), (2, 3), (8, 3), (1, 4), (9, 4)]
>>> #^ ^ ^ ^ ^ ^ ^ ^ ^