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

相关内容

热门资讯

玩家终于实锤了!闲趣有挂吗(分... 亲,闲趣这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,闲趣的开挂软件,名称叫闲趣...
玩家终于实锤了!乐悠空间有挂吗... 您好,乐悠空间这款游戏可以开挂的,确实是有挂的,需要了解{请加QQ群客服咨询:1075075785}...
玩家终于实锤了!青藤鼎趣麻将有... 玩家终于实锤了!青藤鼎趣麻将有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)一、青藤鼎趣麻将AI...
玩家终于实锤了!微乐浙江麻将有... 你好微乐浙江麻将这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785...
玩家终于实锤了!悠闲游戏有挂吗... 自定义悠闲游戏系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你是想分...
玩家终于实锤了!决胜斗地主有挂... 自定义决胜斗地主系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你是想...
玩家终于实锤了!龙焱互娱有挂吗... 自定义龙焱互娱系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你是想分...
玩家终于实锤了!大胜跑得快有挂... 玩家终于实锤了!大胜跑得快有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)一、大胜跑得快AI软件...
玩家终于实锤了!大唐麻将有挂吗... 自定义大唐麻将系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管你是想分...
玩家终于实锤了!粤麻圈麻将有挂... 玩家终于实锤了!粤麻圈麻将有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩...
玩家终于实锤了!同城游牛鬼有挂... 玩家终于实锤了!同城游牛鬼有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩...
玩家终于实锤了!艾彼娱乐有挂吗... 玩家终于实锤了!艾彼娱乐有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩家...
玩家终于实锤了!打两圈麻将有挂... 您好:打两圈麻将确实真的有挂,软件请加QQ群客服咨询:1075075785确实是有挂的,很多玩家在这...
玩家终于实锤了!科乐斗地主有挂... 玩家终于实锤了!科乐斗地主有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)是一款可以让一直输的玩...
玩家终于实锤了!POKERIS... 自定义POKERIST系统规律,只需要输入自己想要的开挂功能,一键便可以生成出微扑克专用辅助器,不管...
玩家终于实锤了!大富豪有挂吗(... 你好大富豪这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785】, ...
玩家终于实锤了!乐胡娱乐有挂吗... 玩家终于实锤了!乐胡娱乐有挂吗(分享技巧)原来是有挂的(已更新)(今日头条)1、让任何用户在无需AI...
玩家终于实锤了!哈哈长沙麻将有... 你好哈哈长沙麻将这个游戏其实有挂的,确实是有挂的,需要了解【请加QQ群客服咨询:1075075785...
玩家终于实锤了!中至斗地主有挂... 您好:中至斗地主确实真的有挂,软件请加QQ群客服咨询:1075075785确实是有挂的,很多玩家在这...
玩家终于实锤了!海浪手游有挂吗... 亲,海浪手游这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,海浪手游的开挂软件,名...