学不会的python之通过某几个关键字排序、分组一个字典列表(列表中嵌套字典)
创始人
2024-04-23 20:22:20
0

通过某个关键字排序、分组一个字典列表

    • 排序
      • 问题描述
      • 解决方案
        • 1.operator 模块的 itemgetter 函数
        • 2.lambda 表达式
      • 引申
    • 分组
      • 问题描述
      • 解决方案
        • 1.itertools.groupby() 函数
        • 2.defaultdict() 构建多值字典

排序

问题描述

  • 现在你有一个字典列表(列表中嵌套字典),你想要根据某个或某几个字典的字段来排序整个列表,如下:
rows = [{'fname': 'Brian', 'lname': 'Jones', 'uid': 1003},{'fname': 'David', 'lname': 'Beazley', 'uid': 1002},{'fname': 'John', 'lname': 'Cleese', 'uid': 1001},{'fname': 'Big', 'lname': 'Jones', 'uid': 1004}
]

解决方案

1.operator 模块的 itemgetter 函数

  • operator.itemgetter() 函数有一个被 rows 中的记录用来查找值的索引参数。可以是一个字典键的键,一个整形值或者任何能够传入一个对象的 getitem () 方法的值
  • 如果你传入多个索引参数给 itemgetter() ,它生成的 callable 对象会返回一个包含所有元素值的元组,并且 sorted() 函数会根据这个元组中元素顺序去排序。但你想要同时在几个字段上面进行排序 (比如通过姓和名来排序,也就是例子中的那样) 的时候这种方法也是很有用的

如下举例:

  • 通过uid排序
    在这里插入图片描述
from operator import itemgetterrows_by_uid=sorted(rows,key=itemgetter('uid'))
  • 通过姓、名进行排序
    在这里插入图片描述
rows_by_lfname = sorted(rows, key=itemgetter('lname', 'fname'))

2.lambda 表达式

在这里插入图片描述

rows_by_uid = sorted(rows, key=lambda r: r['uid'])
rows_by_lfname = sorted(rows, key=lambda r: (r['lname'], r['fname']))

引申

  • 上述所使用到的技巧也是适用于min()和max()等函数,如下举例:
    在这里插入图片描述
max(rows, key=itemgetter('uid'))
min(rows, key=lambda x: x.get('fname'))

分组

问题描述

  • 现在你有一个字典列表(列表中嵌套字典),你想要根据某个或某几个字典的字段来将整个列表进行分组,如下:
rows = [{'address': '5412 N CLARK', 'date': '07/01/2012'},{'address': '5148 N CLARK', 'date': '07/04/2012'},{'address': '5800 E 58TH', 'date': '07/02/2012'},{'address': '2122 N CLARK', 'date': '07/03/2012'},{'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},{'address': '1060 W ADDISON', 'date': '07/02/2012'},{'address': '4801 N BROADWAY', 'date': '07/01/2012'},{'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]

解决方案

1.itertools.groupby() 函数

  • 将上述的字典列表进行分组,首先需要将其进按照需要分组的字段进行排序,然后在使用itertools.groupby() 函数进行分组

  • groupby() 函数扫描整个序列并且查找连续相同值 (或者根据指定 key 函数返回值相同) 的元素序列。在每次迭代的时候,它会返回一个值和一个迭代器对象,这个迭代器对象可以生成元素值全部等于上面那个值的组中所有对象
    在这里插入图片描述

  • 一个非常重要的准备步骤是要根据指定的字段将数据排序。因为 groupby() 仅仅检查连续的元素,如果事先并没有排序完成的话,分组函数将得不到想要的结果

如下举例:

  • 按照日期date进行分组
    在这里插入图片描述
from operator import itemgetter
from itertools import groupbyrows = [{'address': '5412 N CLARK', 'date': '07/01/2012'},{'address': '5148 N CLARK', 'date': '07/04/2012'},{'address': '5800 E 58TH', 'date': '07/02/2012'},{'address': '2122 N CLARK', 'date': '07/03/2012'},{'address': '5645 N RAVENSWOOD', 'date': '07/02/2012'},{'address': '1060 W ADDISON', 'date': '07/02/2012'},{'address': '4801 N BROADWAY', 'date': '07/01/2012'},{'address': '1039 W GRANVILLE', 'date': '07/04/2012'},
]# 排序(上面已经讲过了)
rows.sort(key=itemgetter('date'))
# 分组
for date, items in groupby(rows, key=itemgetter('date')):print(date)print(list(items))

2.defaultdict() 构建多值字典

  • 如果你仅仅只是想根据 date 字段将数据分组到一个大的数据结构中去,并且允许随机访问
    在这里插入图片描述
from _collections import defaultdictrows_by_date=defaultdict(list)
for row in rows:rows_by_date[row['date']].append(row)
print(rows_by_date)
  • 在这个这个例子中,我们没有必要先将记录排序。因此,如果对内存占用不是很关心,这种方式会比先排序然后再通过 groupby() 函数迭代的方式运行得快一些

相关内容

热门资讯

书籍摆放造型:为家里增添文艺小... 哎呀,说到书籍摆放造型,我这心里头就冒出一股子暖流。你知道吗,书不只是知识的海洋,它们还是家里的小风...
vmware freebsd-... 哎呀,说到FreeBSD和VMware,这可真是一对让人又爱又恨的组合啊!想象一下,你手上有个强大又...
卡西欧手表三个小表盘-卡西欧手... 嘿,朋友们,今天咱们聊聊那些常常被忽视的小东西——卡西欧手表上的三个小表盘!没错,就是那些看起来不起...
shell脚本学习指南 pdf... 嘿,大家好!今天我要给大家带来一个超级棒的消息,那就是我们的《Shell脚本学习指南》PDF版可以下...
肛门失禁能治疗吗-肛门失禁虽尴... 嘿,朋友们,今天咱们聊聊一个有点尴尬但又不得不面对的话题——肛门失禁。这事儿听起来就让人皱眉头,对吧...
了解克罗恩病的六大标准,助你战... 哎呀,说到克罗恩病,这可不是什么好玩意儿!这小怪兽时不时就在我肚子里闹腾,真让人头疼。医生告诉我,要...
朝阳医院病案科电话:快节奏都市... 在这个快节奏的都市生活中,朝阳医院病案科电话成了一个神奇的联系点,它不仅仅是一串数字,更是一段段人生...
windows应用商店安装位置... 大家好呀,我今天真是有点小抓狂,想跟大家聊聊我们亲爱的Windows应用商店,那个总是让人又爱又恨的...
iobit unlocker下... 哎呀,大家有没有遇到过那种文件被莫名其妙地锁定,想删删不了,想改改不动的抓狂时刻?我可是深受其害啊!...
全国重名查询系统 百度-全国重... 大家好,我今天真的是超级兴奋,要给大家带来一个超级酷炫的消息——全国重名查询系统,这玩意儿简直太神奇...
linux与windows-L... 大家好,我是个对电脑操作系统又爱又恨的普通用户。今天咱们就来聊聊Linux和Windows这对“冤家...
xp纯净版系统下载原版-找回简... 嘿,各位老铁们,今天咱们聊聊那个让人又爱又恨的XP系统!你们还记得那个蓝天白云的桌面吗?那种简洁到让...
根据身份证号码查姓名-身份证号... 哎呀,说到这个身份证号码查姓名的事儿,真是让人又好奇又紧张!你知道吗,每个人的身份证号码就像是一串神...
informix-探索神秘的 ... 大家好,我是你们的数据库小弟,今天我要聊聊那个让我心情复杂的家伙——Informix。哎呀,说起这个...
风林火山日本电影-风林火山:一... 嘿,朋友们,今天我想聊聊那部让我心跳加速的电影——《风林火山》。这不仅仅是一部电影,它是一场穿越时空...
带raid驱动的win2024... 哎呀,说到这个Win2024配上RAID驱动,我这心里啊,真是五味杂陈!你知道吗,每次我开机看到那熟...
欧姆龙编码器说明书-欧姆龙编码... 哎呀,说到这个欧姆龙编码器啊,真是让人又爱又恨!你知道吗,这个小东西虽然看起来不起眼,但它可是控制着...
net framework 4... 哎呀,说到NETFramework4.52,这可真是我编程路上的老朋友了!每次打开电脑,不管是要写个...
linux运行apk文件-如何... 嘿,大家好!今天咱们聊聊一个挺有趣的话题——Linux系统上跑APK文件。是不是听起来就有点像两个平...
nvvsvc.exe可以禁止吗... 哎呀,说到这个nvvsvc.exe,我这心里就一阵烦躁!你知道吗,每次电脑卡得像老牛拉破车,我就恨不...