sort/sorted排序

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']
原文地址:https://www.cnblogs.com/alantammm/p/15494347.html