Python:【基础语法】 sort()函数、sorted()函数
sort()函数
1.描述
sort() 函数用于对原列表进行排序,如果指定参数,则使用比较函数指定的比较函数。
sort()的排序是稳定排序
2.语法
list.sort( key=None, reverse=False)
3.参数
-
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
这个元素可以是待排序列表中可迭代对象的一个元素,也可以是自己构造的特殊元素如构造的元组(可通过实例具体理解) -
reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。
4.返回值
没有返回值,对原列表的对象进行排序,即修改了原列表。
5.实例
① 默认值排序
>>>lis1=[1, 3, 5, 4, 2]
#字符串按字典序排序
>>>lis2=["zhang", "cheng", "zheng", "chen", "li"]
>>>lis1.sort()
>>>lis2.sort()
>>>lis1
>>>lis2
[1, 2, 3, 4, 5]
['chen', 'cheng', 'li', 'zhang', 'zheng']
② 关键字排序
#获取列表的第二个元素,即以列表中的元组对象的第二个元素为key
def takeKey(s):
return s[1]
lis=[("zhang",22), ("wang",23), ("cheng",18), ("ren",22)]
#使用关键字排序
lis.sort(key=takeKey)
print(lis)
结果为:
[('cheng', 18), ('zhang', 22), ('ren', 22), ('wang', 23)]
③ 自定义排序
上面的关键字排序即关键字为列表对象中的元素。也可以自己定义key进行排序
如问题:重新排列日志文件
logs = ["a1 9 2 3 1","g1 act car","zo4 4 7","ab1 off key dog","a8 act zoo","a2 act car"]
#自定义关键字
def takeKey(log:str) -> tuple:
#将列表元素(字符串)分割为标识符(a)与具体内容(b)
a,b=log.split(' ',1)
#根据内容b的类型,返回关键字
#内容为字母,即字母日志;内容为数字,即数字日志
#根据排序要求,先排字母日志,再拍数字日志,因此字母日志标记为0,数字日志标记为1
#其次,字母日志先按内容排序,内容相同再按标识符排序
return (0,b,a) if b[0].isalpha() else (1,)
#使用关键字排序
#因为sort()是稳定排序,因此数字日志最终排序仍保持原来的顺序
logs.sort(key=takeKey)
print(logs)
结果为:
["a2 act car","g1 act car","a8 act zoo","ab1 off key dog","a1 9 2 3 1","zo4 4 7"]
理解:
对logs列表中的每一个字符串元素按照自定义关键字(n,s1,s2)这样的元组进行排序,每一个元素都有对应的元组,排序时按照元组的元素顺序依次排序
sorted()函数
1.描述
sorted() 函数对所有可迭代的对象进行排序操作。
sort()与sorted()的区别:
1)sort()只针对list,而sorted()可以对所有可迭代的对象进行排序操作。
2)二者对list操作,sort()是在原来的list上进行,即会修改原列表;而sorte()是生成一个新的list,不是在原来的基础上进行的操作。
因此通常使用 list.sort() 与 l2=sorted(l1)
2.语法
sorted(iterable, key=None, reverse=False)
3.参数
iterable:可迭代对象,有:列表、元组、字典、集合等
key:主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse: 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
4.返回值
返回排序后的列表
5.实例
①列表
#默认为升序
>>>print(sorted([4,3,2,5,1]))
[1,2,3,4,5]
②字典
#1.简单字典(单个字典)
"""
① 对单个字典进行排序,相当于按字典的key值排序
等同于sorted(c.keys())
"""
>>>c={1: 'D', 2: 'B', 4: 'E',3: 'C', 5: 'A'}
>>>print(sorted(c))
[1,2,3,4,5]
>>>print(sorted(c.keys()))
[1,2,3,4,5]
"""
② 按照value值对字典排序
key使用lambda匿名函数取value进行排序
"""
#key=lambda
>>>print(sorted(c.items(),key=lambda item:item[1]))
[(5, 'A'), (2, 'B'), (3, 'C'), (1, 'D'), (4, 'E')]
#2.多个字典(字典列表)
#① 通过key/value排序
>>>array = [{"age":20,"name":"a"},{"age":25,"name":"b"},{"age":10,"name":"c"}]
>>>array = sorted(array,key=lambda x:x["age"])
>>>print(array)
[{'age': 10, 'name': 'c'}, {'age': 20, 'name': 'a'}, {'age': 25, 'name': 'b'}]
#② 多列排序,相同成绩的按照名字升序排序:
>>>array = [{'name':'alice', 'score':38}, {'name':'bob', 'score':18}, {'name':'darl', 'score':28}, {'name':'christ', 'score':28}]
>>>array = sorted(d1, key=lambda x:(-x['score'], x['name']))
>>>print(array)
[{'name': 'alice', 'score': 38}, {'name': 'christ', 'score': 28}, {'name': 'darl', 'score': 28}, {'name': 'bob', 'score': 18}]
③ 其他可迭代对象
——通常用于多列排序
应用一:两个对应的列表,实现一个列表排序,另一个列表随之排序的目的,借助使用zip()函数完成
>>>A=[1,2,3]
>>>B=[5,7,7]
>>>zipped=zip(A,B)
>>>sorted_zip=sorted(zipped,key=lambda x:(-x[1],-x[0]))
>>>print(sorted_zip)
[(3, 7), (2, 7), (1, 5)]
#再进行拆分
>>>xl,yl=[list(x) for x in zip(*sorted_zip)]
>>>print(xl,yl)
[3,2,1] [7,7,5]