zoukankan      html  css  js  c++  java
  • 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一些比较实用的标准库的用法。

  • 相关阅读:
    浏览器兼容性优化
    js操作table(增加行,删除行,上移,下移,复制行)
    褚时健传读后感
    新鞋
    八达岭奥莱
    springMVC 多方法controller
    springMVC入门配置及helloworld实例
    springMVC源码下载地址
    spring3mvc与struts2比较
    hql语句拼接的替换方式
  • 原文地址:https://www.cnblogs.com/c-x-a/p/13605270.html
Copyright © 2011-2022 走看看