|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 大马强 于 2022-1-19 19:48 编辑
通过公共键对字典序列排序
问题描述:
对于一个字典列表,我们想通过一个或多个字典中的值来进行排序
借助 operator库的 itemgetter函数
一、单个键from operator import itemgetter
datas = [
{"name": "小明", "lname": "xm", "uid": "002"},
{"name": "小红", "lname": "xh", "uid": "002"},
{"name": "小白", "lname": "xb", "uid": "001"},
{"name": "小蓝", "lname": "xl", "uid": "004"},
{"name": "笑明", "lname": "xm", "uid": "003"}
]
# 单个键
data_by_name = sorted(datas, key=itemgetter("name"))
data_by_uid = sorted(datas, key=itemgetter("uid"))
print(data_by_name)
print(data_by_uid)
[{'name': '小明', 'lname': 'xm', 'uid': '002'},
{'name': '小白', 'lname': 'xb', 'uid': '001'},
{'name': '小红', 'lname': 'xh', 'uid': '002'},
{'name': '小蓝', 'lname': 'xl', 'uid': '004'},
{'name': '笑明', 'lname': 'xm', 'uid': '003'}]
-----------------------------------------------
[{'name': '小白', 'lname': 'xb', 'uid': '001'},
{'name': '小明', 'lname': 'xm', 'uid': '002'},
{'name': '小红', 'lname': 'xh', 'uid': '002'}, 与原数据的顺序有关
{'name': '笑明', 'lname': 'xm', 'uid': '003'},
{'name': '小蓝', 'lname': 'xl', 'uid': '004'}]
二、多个键data_by_uid_lname = sorted(datas, key=itemgetter("uid", "lname"))
print(data_by_uid_lname)
[{'name': '小白', 'lname': 'xb', 'uid': '001'},
{'name': '小红', 'lname': 'xh', 'uid': '002'},
{'name': '小明', 'lname': 'xm', 'uid': '002'},
{'name': '笑明', 'lname': 'xm', 'uid': '003'},
{'name': '小蓝', 'lname': 'xl', 'uid': '004'}]
如果字段都相等,那就要看其原列表中的相对位置
三、用lambda 代替 itemgetterdata_by_name = sorted(datas, key=lambda s: s["name"])
data_by_uid_lname = sorted(datas, key=lambda s: (s["name"], s["uid"]))
"""itemgetter 速度会比 lambda快"""
# 其他函数搭配
print(max(datas, key=lambda s: s["name"]))
print(max(datas, key=itemgetter("name")))
print(min(datas, key=lambda s: s["name"]))
print(min(datas, key=itemgetter("name")))
{'name': '笑明', 'lname': 'xm', 'uid': '003'}
{'name': '笑明', 'lname': 'xm', 'uid': '003'}
{'name': '小明', 'lname': 'xm', 'uid': '002'}
{'name': '小明', 'lname': 'xm', 'uid': '002'}
但是itemgetter速度会比lambda快
|
|