数据重组:对一堆相似字典进行分类统计(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}}

  

输出:

原文地址:https://www.cnblogs.com/andy9468/p/10402916.html