Python排序函数

时间:2016-12-04 17:05:29

标签: python

有人可以解释为什么下面的lambda排序会返回这个结果吗?

示例1

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

示例2

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

2 个答案:

答案 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,这是最低值,并且将首先出现。对于19,键返回4,然后最后排序。密钥生成相同值的任何位置(如输入值32的{​​{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的值首先出现,最远的值出现在最后。