学不会的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() 函数迭代的方式运行得快一些

相关内容

热门资讯

安卓9系统设置密码破解,轻松应... 你有没有遇到过这种情况:手机里装了安卓9系统,不小心设置了密码,结果现在想找回数据,却因为密码而头疼...
ipad是安卓系统还是pc系统... 你有没有想过,那个陪伴你上课、工作、娱乐的iPad,它到底属于哪个系统家族呢?是不是一直好奇,iPa...
安卓虚拟系统推荐软件,精选软件... 你是不是也和我一样,对安卓虚拟系统情有独钟?想要在手机上体验不同的操作系统,但又不想牺牲太多的性能和...
IMX6安装安卓系统,基于IM... 你有没有想过,一台普通的IMX6处理器,竟然能变身成为安卓系统的得力助手?没错,今天就要来跟你聊聊这...
安卓144系统怎么样,新功能与... 你有没有听说安卓144系统最近上线了?这可是安卓家族里的新成员,听说功能强大,性能卓越。今天,就让我...
用安卓系统玩儿黎明杀机,惊悚生... 亲爱的安卓用户们,你是否曾在深夜里被《黎明杀机》这款游戏的刺激与紧张所吸引?想象在安卓设备上畅玩这款...
安卓手机套苹果系统,跨界体验的... 你有没有想过,如果安卓手机突然穿上了苹果系统的外衣,会是怎样的景象呢?想象那会是怎样的操作体验,又会...
安卓系统息屏键在哪,息屏键隐藏... 你是不是也和我一样,有时候在使用安卓手机的时候,突然发现那个神奇的息屏键去哪儿了?别急,今天就来带你...
安卓系统哪个仿ios 你有没有发现,现在手机市场上,安卓系统手机越来越多了,各种花里胡哨的功能让人眼花缭乱。但是,你知道吗...
华为平板重装系统安卓,操作指南... 你有没有发现,华为平板用久了,系统有时候会变得有点“懒洋洋”的,反应慢不说,还时不时地给你点小麻烦。...
攻击安卓系统电子书,深度解析潜... 你知道吗?在这个数字化时代,电子书可是越来越受欢迎了。不过,你知道吗?有些不法分子竟然敢攻击安卓系统...
华为手机安卓8系统root,华... 你有没有想过,你的华为手机安卓8系统竟然可以来个“大变身”?没错,我要说的就是——root!别小看了...
安卓系统电脑下载微信,轻松实现... 你有没有想过,在电脑上用微信聊天也是一种别样的体验呢?想象坐在舒适的椅子上,手握鼠标,就能和朋友们畅...
安卓系统和电脑共享,打造高效协... 你有没有想过,你的安卓手机和电脑之间竟然可以如此亲密无间地共享信息呢?想象你正在用手机刷着抖音,突然...
ipadmini刷安卓系统教程... 你有没有想过给你的iPad mini来个变身大法,让它从苹果的怀抱跳到安卓的乐园呢?没错,今天就要手...
安卓微信的8.0系统,安卓系统... 你知道吗?最近安卓微信的8.0系统可是火得一塌糊涂呢!这款新系统不仅带来了全新的界面,还有一堆实用的...
安卓系统自带sqlite么,A... 你有没有想过,你的安卓手机里是不是藏着一个强大的数据库呢?没错,就是那个SQLite!今天,就让我带...
进入安卓系统几秒后黑屏,揭秘原... 最近是不是你也遇到了这样的烦恼:手机刚进入安卓系统,屏幕突然就黑了,啥也看不见?这可真是让人头疼啊!...
安卓系统gbc模拟器,重温经典... 你有没有想过,在手机上重温那些经典的GBA游戏呢?想象在拥挤的地铁里,或者是在午后的阳光里,你就能轻...
魅蓝s6刷安卓原生安卓系统,打... 你有没有听说最近魅蓝S6刷安卓原生系统的事情?这可是手机圈里的一件大事情呢!想象你的魅蓝S6瞬间变身...