python 列表排序 作者:马育民 • 2024-03-23 08:18 • 阅读:10011 # 说明 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 原文出处:http://malaoshi.top/show_1IX7NMnEH9kx.html