如果有人阅读后发现我的理解有不到位的情况,请慷慨指出。
sorted 是一种高阶函数,能够和其它函数嵌套在一起,而形如map,reduce,filter等高阶函数的特征,它能够接收key函数,来把key函数应用在每一个即将排序的元素身上,并返回一个值,根据返回值来进行排序,例如在以下程序中:
friends_name = ['Tony', 'Bob', 'Zoe', 'Alice','Alien\'s']#python使用\来转义
def mysort(m):
return m.lower()
print(sorted(friends_name,key=mysort))
输出的最终结果为:
['Alice', "Alien's", 'Bob', 'Tony', 'Zoe']
在mysort函数中,我们返回了每个字符串的小写,于是sorted函数依据小写顺序给我们的元素排了序。
更改一下,把这个数组变成字典,看看怎么样
friends_name = {'Tony':46, 'Bob':45, 'Zoe':97, 'Alice':45,"Alien\'s":99}
def mysort(m):
return friends_name[m]#传入m在字典中代表的值
print(sorted(friends_name,key=mysort))
输出结果:
['Bob', 'Alice', 'Tony', 'Zoe', "Alien's"]
看上去确实按照我们指定的新规则排序了,毕竟指定了字典的索引名,就找到了它所对应的值。
改成数组内的元组呢?
friends_name = [('Tony',46), ('Bob',45), ('Zoe',97), ('Alice',45),("Alien\'s",99)]
def mysort(m):
return m[0]
print(sorted(friends_name,key=mysort))
很显然,我们传入的m在这个函数中是一个元组,最后的判断依据则是元组第1个元素m[0]。
这是按数组内的元组的第一个数据排序的结果:
[('Alice', 45), ("Alien's", 99), ('Bob', 45), ('Tony', 46), ('Zoe', 97)]
我们还可以再改改,让它按照元组第二个元素m[1]排序:
[('Bob', 45), ('Alice', 45), ('Tony', 46), ('Zoe', 97), ("Alien's", 99)]
再来一下,把Bob的名字改为Aob,让它在按照分数排序的前提下按照名字顺序排序:
friends_name = [('Tony',46), ('Aob',45), ('Zoe',97), ('Alice',45),("Alien\'s",99)]
print(sorted(friends_name,key=lambda m:(m[1],m[0])))
是不是更加简单?我们传入了匿名函数,优先按照元组第二个元素排序(先返回m[1]),之后如果一样,按第一个元素即名字排序(返回m[0]):
[('Alice', 45), ('Aob', 45), ('Tony', 46), ('Zoe', 97), ("Alien's", 99)]
综上所述,sorted传入key函数的本质是返回值,根据返回的值来排序。通过编写函数返回不同的值,可以实现sorted函数的自定义排序方式,这比c语言的语句更加简便。