大马强 发表于 2022-1-19 19:48:57

cookbook 1.13

本帖最后由 大马强 于 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 代替 itemgetter
data_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快
页: [1]
查看完整版本: cookbook 1.13