zoukankan      html  css  js  c++  java
  • 数据重组:对一堆相似字典进行分类统计(shidebin)

    数据重组

    # 需求说明:将data_source分类统计,并输出为如下data_final的形式:
    # data_final ===》
    # {
    # 'area': [{'place': '南山区', 'amount': 3}, {'place': '宝安区', 'amount': 3}],
    # 'type': {'other': 3, 'govenment': 1, 'education': 1, 'business': 1}
    # }
    
    def class_sum(data_source_list, class_key_name, sum_key_name):
        '''对一堆相似字典进行分类统计
    
        :param data_source_list: 原始数据,列表中放字典。如:[{"c":"c1","count":2},{"c":"c2","count":1},{"c":"c1","count":1}]
        :param class_key_name: 分类的key名称。如"c"
        :param sum_key_name: 统计计数的key名称。如"count"
        :return:分类清单 和 对应的统计计数。如:list_class=["c1", "c2"] 和 list_sum=[3, 1]
        '''
        list_class = []
        list_sum = []
        for dict_tmp in data_source_list:
            sum_tmp = 0
            # print(dict_tmp)
            if class_key_name in dict_tmp:
                if dict_tmp[class_key_name] not in list_class:
                    list_class.append(dict_tmp[class_key_name])
                    sum_tmp += dict_tmp[sum_key_name]
                    list_sum.append(sum_tmp)
                else:
                    sum_index = list_class.index(dict_tmp[class_key_name])
                    sum_tmp = list_sum[sum_index]+dict_tmp[sum_key_name]
                    list_sum[sum_index] = sum_tmp
        return (list_class, list_sum)
    
    data_source = [
        {
            "town_name": "南山区",
            "type": "other",
            "count": 1
        },
        {
            "town_name": "南山区",
            "type": "govenment",
            "count": 1
        },
        {
            "town_name": "南山区",
            "type": "education",
            "count": 1
        },
        {
            "town_name": "宝安区",
            "type": "other",
            "count": 2
        },
        {
            "town_name": "宝安区",
            "type": "business",
            "count": 1
        }
    ]
    
    for dict_tmp in data_source:
        print(dict_tmp)
    
    data_final = {}
    data_final['area'] = []
    data_final['type'] = {}
    
    # 1.1、按照town_name分类和统计count
    list_class, list_sum = class_sum(data_source, "town_name", 'count')
    
    print(1111111111111)
    print(list_class)
    print(list_sum)
    
    # 2.1 组装area:根据town_name分类和统计
    data_final["area"] = list(map(lambda x, y: {"place": x, "amount": y}, list_class, list_sum))
    
    # 1.2、按照type分类和统计count
    list_class, list_sum = class_sum(data_source, "type", 'count')
    
    
    print(2222222222222)
    print(list_class)
    print(list_sum)
    
    # 2.2 组装type:根据type分类和统计
    for c in list_class:
        data_final["type"][c] = list_sum[list_class.index(c)]
    print(data_final)
    
    # 想要的 {'area': [{'amount': 3, 'place': '南山区'}, {'amount': 3, 'place': '宝安区'}], 'type':{'other': 3, 'govenment': 1, 'education': 1, 'business': 1}}
    

      

    输出:

  • 相关阅读:
    面向对象和面向过程的区别
    k-means算法
    win10系统下安装mysql
    python并发编程之多进程
    操作系统的概念
    前端基础之html
    聚类分析
    决策树
    Mysql
    SQL练习题
  • 原文地址:https://www.cnblogs.com/andy9468/p/10402916.html
Copyright © 2011-2022 走看看