Python 标准库实践之合并字典组成的列表


最近做了个数据合并的需求这里记录下:

要求如下:

dict_of_list1 = [{"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}, {"name": "wangwu", "age": 20}]
dict_of_list2 = [{"name": "zhangsan", "province": "shandong"}, {"name": "lisi",
                                                                "province": "changsha"},
                 {"name": "xiaohong", "province": "guangxi"}, {"name": "wangwu",
                                                               "province": "xizang"}]


将上面的两个列表的字典进行合并将名字一样的项目放在一起。

形如:

[{"name":"zhangsan","age":18,"province":"shandong"},{"name":"xiaohong","province":"guangxi"}]

传统解法

dict_of_list1 = [{"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}, {"name": "wangwu", "age": 20}]
dict_of_list2 = [{"name": "zhangsan", "province": "shandong"}, {"name": "lisi",
                                                                "province": "changsha"},
                 {"name": "xiaohong", "province": "guangxi"}, {"name": "wangwu",
                                                               "province": "xizang"}]
all_data = dict_of_list1 + dict_of_list2
d = {}
for item in all_data:
    name = item["name"] 
    if name in d: 
        d[name].update(item)
    else:
        d[name] = item
result = []
for k,v in d.items():
    result.append(v)
sorted(v)
print(result)

根据要求得知,我们需要根据姓名一样的进行合并,那么可以创建一个新的字典可以把姓名当作字典的键,然后判断这个键是否在这个字典中,如果不存在就是赋值,否则去更新其值。因为它的值是字典类型所以可以通过update进行更新,这种方法可以适用到其他语言。

下面再来一个python独有的解法。

通过分组函数

利用python标准库

from operator import itemgetter
from itertools import groupby
from collections import ChainMap


dict_of_list1 = [{"name": "zhangsan", "age": 18}, {"name": "lisi", "age": 19}, {"name": "wangwu", "age": 20}]
dict_of_list2 = [{"name": "zhangsan", "province": "shandong"}, {"name": "lisi",
                                                                "province": "changsha"},
                 {"name": "xiaohong", "province": "guangxi"}, {"name": "wangwu",
                                                               "province": "xizang"}]
key = itemgetter("name")
all_data = dict_of_list1 + dict_of_list2
all_data.sort(key=key)
result_list = []
for x, y in groupby(all_data, key=key):
    d = dict(ChainMap(*y))
    result_list.append(d)
sorted(result_list, key=key)
print(result_list)

我们可以使用itertools模块的groupby按照name进行分组。

groupby有两个参数第一个是一个可迭代对象,第二个是指定按照什么去分组,类似我们排序时指定key的值,这里key的值可以使用lambda表达式,或者使用标准库operator的itemgetter方法,实现相同的效果。

使用这个方法有一个要求,那就是需要提前对可迭代对象进行排序

经过groupby修饰之后我们得到一个key和itertools._grouper对象,key就是我们指定那个键的值,这里就是name的值,然后可以对itertools._grouper对象进行拆分,得到几个字典,再通过collections的ChainMap对

其元素进行字典合并,之后转为dict对象。最终加入到指定列表完成我们的任务。

该方法主要是熟悉Python一些比较实用的标准库的用法。

更多Python标准库知识,请参阅《Python 3标准库》。全书以案例驱动的方式讲解了标准库中数百个模块的使用方法(如何工作)和工作原理(为什么要这样工作),比标准库的官方文档更容易理解(一个简单的示例比一份手册文档更有帮助),为Python程序员熟练掌握和使用这些模块提供了绝佳指导。

推荐阅读

全球资深Python专家亲自执笔,Python语言的核心开发人员鼎力推荐。以案例为导向,全面讲解标准库中数百个模块的使用方法和工作原理,简洁易懂,可操作性极强。

点击链接了解详情并购买

更多精彩回顾

书讯 |11月书讯(下)| 这些好书必须“买买买”!

书讯 |11月书讯(上)| 这些好书必须“买买买”!

资讯 |DB-Engines 10月数据库排名:“三大王”无人能敌,PostgreSQL紧随其后

上新 | 华为的数字化转型与数据治理
书单 | 开学季——计算机专业学生必读的10本畅销经典

干货 | 数据分析必读干货:简单而实用的3大分析方法

收藏 | (万字长文)Spring的核心知识尽揽其中

视频 | 大佬出镜推荐不可不读系列——程序员陈彼得

赠书 | 【第28期】10本精选大数据好书等你来选

点击阅读全文购买

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值