作者 | 陈祥安

来源 | 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_list2d = {}for item in all_data:    name = item["name"]     if name in d:         d[name].update(item)    else:        d[name] = itemresult = []for k,v in d.items():    result.append(v)sorted(v)print(result)

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

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

通过分组函数

利用python标准库

from operator import itemgetterfrom itertools import groupbyfrom collections import ChainMapdict_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_list2all_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 groupby用法_Python 标准库实践之合并字典组成的列表相关推荐

  1. python字符串库函数_Python标准库概览(1):string

    Python的 string 标准库保留了一些有用的函数和用于处理文本对象的类,现在我们来一起看一下Python的string标准库还有哪些我们不知道的有趣用法? 01.capwords()函数:将字 ...

  2. print python 带回车_python标准库threading源码解读【二】

    紧接着上一篇文章继续解析源码 甘蔗:python标准库threading源码解读[一]​zhuanlan.zhihu.com 目录 Event的介绍和用法 Event源码解析 以后的内容尽量少一点并且 ...

  3. python文件管理包_Python标准库04 文件管理 (部分os包,shutil包)

    Python标准库04 文件管理 (部分os包,shutil包) 在操作系统下,用户可以通过操作系统的命令来管理文件,参考.Python 标准库则允许我们从 Python 内部管理文件.相同的目的,我 ...

  4. python itertools模块_Python标准库:itertools模块

    来源:j_hao104 简介 官方描述:Functional tools for creating and using iterators.即用于创建高效迭代器的函数. itertools.chain ...

  5. python计算平均数_Python标准库——数学运算

    平均值 statistics模块实现了很多常用的统计公式,允许使用Python的各种数值类型(int.float.Decimal和Fraction)来完成高效计算. 共支持3种形式的平均值:均值(me ...

  6. python指数运算_Python标准库——数学运算

    指数和对数 指数生长曲线在经济学.物理学和其他学科中经常出现.Python有一个内置的幂运算符("**"),不过,如果需要将一个可调用函数作为另一个函数的参数,那么困难需要用到po ...

  7. python configparser模块_Python标准库之ConfigParser模块

    ConfigParser模块用于生成和修改常见配置文档. 比如配置文件格式如下: [DEFAULT] ServerAliveInterval= 45Compression=yes Compressio ...

  8. python随机库函数_python标准库中的随机分布函数

    random.random() 返回一个 随机的浮点数, 值域为 [0.0, 1.0] random.uniform(a, b) 均匀分布 返回一个随机的浮点数N, N的值在a与b之间 等同于 a + ...

  9. python标准类型内建函数_Python 标准库系列之内建函数

    Python的强大有很大一部分是因为其庞大的标准库提供了各式各样的功能,基本上日常使用中你所需要的功能都可以从中找到,从而大大减轻开发人员的压力,节省开发人员的时间,因此,要想更好的使用python, ...

最新文章

  1. The Swift Code之UITextField的使用,及事件委托
  2. C#多线程编程介绍——使用thread、threadpool、timer
  3. Fiddler插件开发 - 实现网站离线浏览功能
  4. 字符串字符和数字分割
  5. JavaSE——常用类库(下)(Date、DateFormat、Calendar、System类)
  6. 数字图像处理:图像平均/加法_OPT小讲堂 ∣ SciSmart图像增强之二值化
  7. 信息学奥赛一本通(1005:地球人口承载力估计)
  8. 不能忽视 php warning
  9. Spring-web源码解析之HttpRequestHandler
  10. Toggle和Slider组件
  11. 关于微信开放平台配置-网站应用
  12. ListView实现物流追踪
  13. 与你的梦,种植于青山绿水间
  14. 【原创】图像处理第5弹:面部表情识别--微笑
  15. 扫描转换html,html+css实现图片扫描仪特效
  16. tl wn322g linux驱动下载,TL-WN322G+驱动
  17. ASEMI整流桥GBP406~GBP410,GBP406参数,GBP410图片
  18. 纽约大学坦登学院计算机专业,纽约大学坦登工程学院
  19. Facebook营销进阶技巧有哪些
  20. CHIL-SQL-语法

热门文章

  1. 编程范式之栈的抽象操作
  2. python编程(windows平台)
  3. C语言和设计模式(外观模式)
  4. android 蓝牙连接obd,Android蓝牙连接汽车OBD设备
  5. python输出文档内容_python输出文件
  6. java怎么修改订单状态_在WooCommerce中自定义订单状态更改时发送电子邮件通知
  7. android textview 动态高度自适应,TextView自适应高度(解决_UITextContainerView布局问题)...
  8. java jdbc 详解_JDBC详解
  9. 什么相片可以两张弄成一张_怎么将两张图片合成一张?
  10. 以太坊ETH不能转账,状态一直是pending状态原因和解决方法