Python之排序函数sorted()详解
sort命令排序⽂章⽬录
描述
sorted() 函数对所有可迭代的对象进⾏排序操作。
sort 与 sorted 区别:
1、sort 是应⽤在 list 上的⽅法,sorted 可以对所有可迭代的对象进⾏排序操作。
2、list 的 sort ⽅法返回的是对已经存在的列表进⾏操作,⽆返回值,⽽内建函数 sorted ⽅法返回的是⼀个新的 list,⽽不是在原来
的基础上进⾏的操作。
语法
sorted(iterable, cmp=None, key=None, reverse=False)
参数说明:
【iterable】 可迭代对象。
【cmp】 ⽐较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,⼤于则返回1,⼩于则返回-1,等于则返回0。(⼀般省略)
【key】主要是⽤来进⾏⽐较的元素,只有⼀个参数,具体的函数的参数就是取⾃于可迭代对象中,指定可迭代对象中的⼀个元素来进⾏排序。
常⽤的⽤来作为参数key的函数有 lambda函数和operator.itemgetter()
尤其是列表元素为多维数据时,需要key来选取按哪⼀位数据来进⾏排序
【reverse】 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
返回值
返回重新排序的列表。需要注意,列表的元素可以是多样的,返回列表的形式与输⼊列表的形式⼀致
实例
⼀般⽤法:
当元素为⼀维数字或字母时,结果返回⼀个新的列表,其中元素按升序或降序排列(根据reverse参数来决定)
list=[1,5,7,2,4]
print(sorted(list))
Output:
[1,2,4,5,7]
list=['d','c','f','a','z']
print(sorted(list))
Output:
['a','c','d','f','z']
list=['vz','1bf','gc','ak','2qz']#若为字符串,则跟据第⼀位的数字-字母顺序来排列
print(sorted(list))
Output:
['1bf','2qz','ak','gc','vz']
⾼级⽤法:
当数据为多维或想要按照特殊形式排序时,通过改变key函数来实现。
可作为参数key的函数形式有
1、lambda函数
list=['a','bc','defg','handsome','qwerrtyyuu']
print(sorted(list,key=lambda x:len(x),reverse=True))
Output:
['qwerrtyyuu','handsome','defg','bc','a']
描述:
匿名函数lambda,是指⼀类⽆需定义标识符(函数名)的函数或⼦程序。
lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
格式:
冒号前是参数,可以有多个,⽤逗号隔开,冒号右边的为表达式。其实lambda返回值是⼀个函数的地址,也就是函数对象。
要点:
(1)lambda 函数不能包含命令,
(2)包含的表达式不能超过⼀个。
说明:
⼀定⾮要使⽤lambda函数;任何能够使⽤它们的地⽅,都可以定义⼀个单独的普通函数来进⾏替换。我将它们⽤在需要封装特殊的、⾮重⽤代码上,避免令我的代码充斥着⼤量单⾏函数。
2、operator.itemgetter()
import operator
tuple_list =[('A',1,5),('B',3,2),('C',2,6)]
print(sorted(tuple_list, key=operator.itemgetter(1)))#即按照第1维进⾏排序
Output:
[('A',1,5),('C',2,6),('B',3,2)]
描述:
operator模块提供的itemgetter函数⽤于获取对象的哪些维的数据,参数为⼀些序号。
a =[1,2,3]
>>> b=operator.itemgetter(1)//定义函数b,获取对象的第1个域的值
>>> b(a)
2
>>> b=operator.itemgetter(1,0)//定义函数b,获取对象的第1个域和第0个的值
>>> b(a)
(2,1)
3、机器学习实例
在决策树的实现中,需要对标签按照其出现的次数进⾏排序
# 按照分类后类别数量排序
def majorityCnt(classList):
classCount ={}
for vote in classList:
if vote not in classCount.keys():
classCount[vote]=0
classCount[vote]+=1
sortedClassCount =sorted(classCount.items(),
key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]
注意:对于字典的排序,需要借助items()函数来遍历其元素
items()函数将字典中的键值对改为元组,并将这些元组放到⼀个列表中
即返回值为⼀个列表,其元素为包含原字典键值对的元组
dict={'Google':'le','Runoob':'www.runoob','taobao':'www.taobao'}
print(dict.items())
Output:
dict_items([('Google','le'),('Runoob','www.runoob'),('taobao','www.taobao')])
因此,此实例中,classCount.items()获得⼀个列表,元素为⼆维元组,key=operator.itemgetter(1)按照后⼀个元素进⾏排序(即标签出现的次数)reverse=True按照降序排列。return sortedClassCount[0][0]为返回出次数最⾼的标签及其次数。
参考

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。