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]
posted @ 2021-12-23 20:09  ZghzzZyu  阅读(394)  评论(0编辑  收藏  举报