sort
列表.sort(key=None,reverse=False) 直接修改该列表,返回None,效率高,但是仅仅只能用于列表
参数 key: 遍历列表所有的元素 作为参数传递给该函数,对调用该函数所返回的结果 进行排序,然后排序后的列表 只是对原始列表排序,这里函数处理所返回的值 并不会改变列表,只是作为排序的参考,这里的函数不加括号 如: str.lower
参数 reverse: 表示正序or倒序 默认为False 正序
# 直接在原列表上修改
li = [2,1,9,7]
li.sort()
print(li) #[1, 2, 7, 9]
#倒序
li = [2,1,9,7]
li.sort(reverse=True)
print(li) #[9, 7, 2, 1]
#使用key,不区分大小写排序
li = ['a','A','b','B']
li.sort()
print(li) # ['A', 'B', 'a', 'b'] 大写在前
li = ['a','A','b','B']
li.sort(key=str.lower)
print(li) # ['a', 'A', 'b', 'B'] 排序是稳定的——如果两个项具有相同的键,它们的顺序将保留在排序列表中 就是上述a A 列表中的每个元素都经过str.lower(元素) 后进行比较,a A 是一样的小写的a,原来小写的a在前面,所以排序后 也在前面
# 测试 排序的稳定性
li = ['A','a','b','B'] # 大写的A 在小写的a 前面
li.sort(key=str.lower)
print(li) # ['A', 'a', 'b', 'B']
sorted
同sort,但是可以作用于所有可迭代对象,并且不会直接修改原对象,是返回的一个新的列表,对所有可迭代对象排序 返回的都是列表
# 列表,返回一些新的列表
li = [3,5,2,1,0]
new_li = sorted(li)
print(new_li) # [0, 1, 2, 3, 5]
#元祖 返回列表
tup = ('a','A','aa','z','bb')
new_tup = sorted(tup,reverse=True)
print(new_tup) #['z', 'bb', 'aa', 'a', 'A']
#集合 返回列表
set1 = {2,3,9,1}
new_set = sorted(set1)
print(new_set) #[1, 2, 3, 9]
#字典: 对键 进行排序,并且返回列表
dic = {9:'hello',8:'hi',0:'mello'}
new_dic = sorted(dic)
print(new_dic) #[0, 8, 9]
根据自定义对象的某些属性进行排序
# 场景,根据学生的年龄排序
class Student:
def __init__(self,name,sex,age,grade) -> None:
self.name = name
self.sex = sex
self.age = age
self.grade = grade
def __repr__(self):
return repr((self.name,self.sex,self.age,self.grade))
# def __str__(self):
# return '这是__str__方法,优先级大于__repr__'
li = [
Student('张三','m',18,60),
Student('李四','m',19,90),
Student('王五','m',17,80),
Student('赵六','F',18,100),
]
new_li = sorted(li,key=lambda stu_ins:stu_ins.age)
print(new_li)
#[('王五', 'm', 17, 80), ('张三', 'm', 18, 60), ('赵六', 'F', 18, 100), ('李四', 'm', 19, 90)]
对于上述的这种 键函数 很常见,所有有如下函数更加便利
from operator import itemgetter,attrgetter,methodcaller
attrgetter
#根据年龄排序,和上述的lambda 两者效果一样 attrgetter
new_li2 = sorted(li,key=attrgetter('age'))
print(new_li2)
#先根据年龄,再根据性成绩排序
new_li = sorted(li,key=attrgetter('age','grade'))
print(new_li)
itemgetter
#根据字符串的最后一个字母排序 itemgetter
li = ['adc','d','AP','ZL']
new_li = sorted(li, key=itemgetter(-1))
print(new_li)
# ['ZL', 'AP', 'adc', 'd']
methodcaller
#不区分大小写排序 methodcaller 必须接一个函数名字符串
li = ['adc','d','AP','ZL']
new_li = sorted(li,key=methodcaller('lower'))
print(new_li)
# ['adc', 'AP', 'd', 'ZL']