• 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一些比较实用的标准库的用法。

  • 相关阅读:
    Atitit attilax要工作研究的要素 纪要 方案 趋势 方向 概念 理论
    Atitit 常见每日流程日程日常工作.docx v7 r8f
    Atitit it 互联网 软件牛人的博客列表
    Atitit 信息链(Information Chain)的概念理解 attilax总结
    Atitit 知识点的体系化 框架与方法 如何了解 看待xxx
    Atitit 聚合搜索多个微博 attilax总结
    Atitit 企业知识管理PKM与PIM
    Atitit 项目沟通管理 Atitit 沟通之道 attilax著.docx
    Atitit 项目管理软件 在线服务 attilax总结 1. 项目管理协作的历史 1 1.1. Worktile 406k 1 1.2. Teambition  584k in baidu
    Atitit.每周末总结 于每周一计划日程表 流程表 v8 import 上周遗漏日志补充 检查话费 检查流量情况 Crm问候 Crm表total and 问候
  • 原文地址:https://www.cnblogs.com/c-x-a/p/13605270.html
Copyright © 2020-2023  润新知