鱼C论坛

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

[技术交流] cookbook 1.13

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

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

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

x
本帖最后由 大马强 于 2022-1-19 19:48 编辑


通过公共键对字典序列排序

问题描述:
        对于一个字典列表,我们想通过一个或多个字典中的值来进行排序

借助 operator库的 itemgetter函数
一、单个键
  1. from operator import itemgetter

  2. datas = [
  3.     {"name": "小明", "lname": "xm", "uid": "002"},
  4.     {"name": "小红", "lname": "xh", "uid": "002"},
  5.     {"name": "小白", "lname": "xb", "uid": "001"},
  6.     {"name": "小蓝", "lname": "xl", "uid": "004"},
  7.     {"name": "笑明", "lname": "xm", "uid": "003"}
  8. ]

  9. # 单个键
  10. data_by_name = sorted(datas, key=itemgetter("name"))
  11. data_by_uid = sorted(datas, key=itemgetter("uid"))
  12. print(data_by_name)
  13. 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'}]


二、多个键
  1. data_by_uid_lname = sorted(datas, key=itemgetter("uid", "lname"))
  2. 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
  1. data_by_name = sorted(datas, key=lambda s: s["name"])
  2. data_by_uid_lname = sorted(datas, key=lambda s: (s["name"], s["uid"]))
  3. """itemgetter 速度会比 lambda快"""

  4. # 其他函数搭配
  5. print(max(datas, key=lambda s: s["name"]))
  6. print(max(datas, key=itemgetter("name")))
  7. print(min(datas, key=lambda s: s["name"]))
  8. 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快

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-30 12:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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