有人可以解释为什么下面的lambda排序会返回这个结果吗?
>> sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))
[5, 4, 6, 3, 7, 2, 8, 1, 9]
sorted ([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(2-x))
[2, 1, 3, 4, 5, 6, 7, 8, 9]
我理解正常的student.age如何进行排序工作,而不是顶部的例子
>>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)]
答案 0 :(得分:4)
key
说“不是按每个位置的实际值排序,而是计算一个新值,按类别排序,然后将原始值放在新列表将在列表中排序的位置”。
首先从原始列表开始:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
为每个项目调用键lambda,创建以下键值(在parens中):
[1 (4),
2 (3),
3 (2),
4 (1),
5 (0),
6 (1),
7 (2),
8 (3),
9 (4)]
然后按照键值的顺序对列表进行排序:
[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]
答案 1 :(得分:2)
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
,然后最后排序。密钥生成相同值的任何位置(如输入值3
和2
的{{1}}),输入将保持原始顺序:
8
然后返回的>>> 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)]
>>> #^ ^ ^ ^ ^ ^ ^ ^ ^
是原始输入值,没有排序键的输出。
最后,该键导致值按距sorted()
的距离排序。最接近5的值首先出现,最远的值出现在最后。