鱼C论坛

 找回密码
 立即注册
查看: 1173|回复: 0

[技术交流] cookbook 1.13

[复制链接]
发表于 2022-1-19 19:48:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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 代替 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快

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 21:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表