说明
Python列表有一个 list.sort() 方法可以直接修改原列表对象进行排序
Python还内置了一个 sorted() 函数对可迭代对象排序并返回新的列表对象
普通排序
特点:原列表的元素顺序不改变,返回一个新列表,新列表是重新排序的
sorted([5, 2, 3, 1, 4])
执行结果:
[1, 2, 3, 4, 5]
key参数
sorted() 函数有 key参数,key形参的值应该是一个函数,它接受一个参数并返回一个用于排序的键
students = [('李雷', 185),('韩梅梅', 160),('lucy', 172)]
def getKey(item):
return item[1]
res = sorted(students, key=getKey)
# res = sorted(students, key=lambda student: student[2])
print(res)
执行结果:
[('韩梅梅', 160), ('lucy', 172), ('李雷', 185)]
reverse 倒序参数
reverse = True 表示倒序
a = [5, 2, 3, 1, 4]
res = sorted(a,reverse=True)
print(res)
执行结果:
[5, 4, 3, 2, 1]
自定义排序
提出问题
文件名如下:
files = ['10.py','20.py','2.py','1.py','3.py']
对文件名,按照数字的顺序进行排序,用上面的方法就无法实现
sorted(files)
执行结果:
['1.py', '10.py', '2.py', '20.py', '3.py']
10.py, 20.py应该排在后面
解决
使用自定义排序
代码
from functools import cmp_to_key
files = ['10.py','20.py','2.py','1.py','3.py']
# a是第二个元素,b是第一个元素
def cmp(a,b):
# 截取文件名
pos = a.rfind(".")
a = a[:pos]
pos = b.rfind(".")
b = b[:pos]
# 比较文件名长度
if len(a) > len(b):
return 1
elif len(a) < len(b):
return -1 # 交换位置
else: # 长度相等时,比较数字大小
ai = int(a)
bi = int(b)
if ai > bi:
return 1
elif ai < bi:
return -1 # 交换位置
else:
return 0 # 表示相等
res = sorted(files,key = cmp_to_key(cmp))
print(res)