andy9468

数据重组

# 需求说明:将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}}

  

输出:

 

分类:

技术点:

相关文章: