排序方法
2.x的代码移植到3.x时,需要将cmp函数转化为key函数
# Python2
list.sort(cmp=None, key=None, reverse=False)
# Python3
list.sort(key=None, reverse=False)
排序有两个方法
list.sort() # list本身将被修改, 返回None
sorted() # 不修改原来的list, 返回一个新的list
排序示例
1、list.sort示例
lst = [3, 2, 1]
print(lst) # [3, 2, 1]
ret = lst.sort()
print(ret) # None
print(lst) # [1, 2, 3]
2、sorted示例
lst = [3, 2, 1]
print(lst) # [3, 2, 1]
ret = sorted(lst)
print(ret) # [1, 2, 3]
print(lst) # [3, 2, 1]
看一个实际需求
有一个人员列表,需要按给定需求排序
from pprint import pprint
# name:姓名
# money:钱
# age:年龄
lst = [
{
'name': 'Tom',
'age': 20,
'money': 2000
},
{
'name': 'Jack',
'age': 25,
'money': 2000
},
{
'name': 'Alice',
'age': 25,
'money': 3000
},
{
'name': 'Steve',
'age': 25,
'money': 3000
}
]
# 未排序前
pprint(lst)
"""
[{'age': 20, 'money': 2000, 'name': 'Tom'},
{'age': 25, 'money': 2000, 'name': 'Jack'},
{'age': 25, 'money': 3000, 'name': 'Alice'},
{'age': 25, 'money': 3000, 'name': 'Steve'}]
"""
1、需求一:单字段排序,钱多的在前
(1)使用lambda 表达式
# 默认从小到大,reverse=True可以逆序排列
lst.sort(key=lambda item: item['money'], reverse=True)
pprint(lst)
"""
[{'age': 25, 'money': 3000, 'name': 'Alice'},
{'age': 25, 'money': 3000, 'name': 'Steve'},
{'age': 20, 'money': 2000, 'name': 'Tom'},
{'age': 25, 'money': 2000, 'name': 'Jack'}]
"""
(2)使用operator.itemgetter 替换 lambda 表达式
from operator import itemgetter
lst.sort(key=itemgetter('money'), reverse=True)
pprint(lst)
"""
[{'age': 25, 'money': 3000, 'name': 'Alice'},
{'age': 25, 'money': 3000, 'name': 'Steve'},
{'age': 20, 'money': 2000, 'name': 'Tom'},
{'age': 25, 'money': 2000, 'name': 'Jack'}]
"""
(3)使用sorted
from operator import itemgetter
lst2 = sorted(lst, key=itemgetter('money'), reverse=True)
pprint(lst2)
"""
[{'age': 25, 'money': 3000, 'name': 'Alice'},
{'age': 25, 'money': 3000, 'name': 'Steve'},
{'age': 20, 'money': 2000, 'name': 'Tom'},
{'age': 25, 'money': 2000, 'name': 'Jack'}]
"""
以上三种方式排序结果都一样
2、需求二:多字段排序
需要满足3个排序要求
- 钱money 多的在前面
- 如果钱money 一样多,年龄age 大的在前
- 如果钱money 和年龄age 都一样,按照名字首字母顺序排序Z-A排序
如果有一个排序函数就很容易解决
(1) 方式一: 自定义一个排序函数
from functools import cmp_to_key
# 自定义一个排序函数
def foo(a, b):
if a['money'] > b['money']:
return 1
elif a['money'] b['age']:
return 1
elif a['age']
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?