说明
Python列表有一个 list.sort() 方法可以直接修改原列表对象进行排序
Python还内置了一个 sorted() 函数对可迭代对象排序并返回新的列表对象
普通排序
特点:原列表的元素顺序改变
a = [5, 2, 3, 1, 4]
a.sort()
执行结果:
[1, 2, 3, 4, 5]
key参数
list.sort() 和 sorted()函数都有一个key参数,key形参的值应该是一个函数,它接受一个参数并返回一个用于排序的键
students = [('李雷', 185),('韩梅梅', 160),('lucy', 172)]
def getKey(item):
return item[1]
students.sort(key = getKey)
print(students)
reverse 倒序参数
reverse = True 表示倒序
a = [5, 2, 3, 1, 4]
a.sort(reverse = True)
print(a)
执行结果:
[5, 4, 3, 2, 1]
自定义排序
提出问题
文件名如下:
files = ['10.py','20.py','2.py','1.py','3.py']
对文件名,按照数字的顺序进行排序,用上面的方法就无法实现
files.sort()
执行结果:
['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 # 表示相等
# files.sort()
files.sort(key = cmp_to_key(cmp))
print(files)
参考:
https://zhuanlan.zhihu.com/p/67322333
https://blog.csdn.net/gongjianbo1992/article/details/107324871
https://zhuanlan.zhihu.com/p/378259530