Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python排序函数_Python - Fatal编程技术网

Python排序函数

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

有人能解释为什么下面的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 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)]
>>> #^       ^       ^       ^       ^       ^       ^       ^       ^