python:计算字典的差值
python:计算字典的差值

python:计算字典的差值

# -*- coding: UTF-8 -*-
"""=========================================================
@Project -> File: 数据版本统计 -> get_json_diff
@IDE: PyCharm
@author: lxc
@date: 2023/2/27 上午 11:06
@Desc:
1-功能描述:
比对两个字典的差别,返回后者减去前者的的值,字典形状不变
注意:
 1. 两字典形状必须相同;
 2. 两字典的值必须均为int类型或数字字符串(99和'99'均可)
2-实现步骤
    1-设立模板字典,形状和两字典相同,且value均改为0
    2-使用dictdiffer库,找出两个字典的差别所在,并将value求差,填充进模板字典内
"""
import copy
from dictdiffer import diff
import logging

logger = logging.getLogger(__name__)

def get_differences(first, second):
    differences = list(diff(first, second))
    dic = change_value_to_zero(second)
    while True:
        break
    for item in differences:
        string = "dic"
        try:
            value = int(item[2][1]) - int(item[2][0])
        except Exception as e:
            logger.error(f"{item[1]}:::该键对应的value非int类型,无法进行求差值\\\n{e}")
            value = None
        if type(item[1]) == str:
            key_chains = item[1].split('.')
            string += ''.join([f"['{key}']" for key in key_chains]) + " = %s" % value
        elif type(item[1]) == list:
            key_chains = item[1]
            for key in key_chains:
                if type(key) == str:
                    string += f"['{key}']"
                elif type(key) == int:
                    string += f"[{key}]"
                else:
                    raise TypeError("找差值存在键类型错误: 非字符串或列表")
            string += " = %s" % value
        else:
            raise TypeError("找差值存在键类型错误: 非字符串或列表")
        exec(string)
    return dic

def get_targe_value(request_body):
    # 循环字典,获取键、值
    for key, values in request_body.items():
        # 判断值的type类型,如果是list,调用get_list() 函数,
        if type(values) == list:
            get_list(values)
        # 如果是字典,调用自身
        elif type(values) == dict:
            get_targe_value(values)
        # 如果值不是list且是需要被替换的,就替换掉
        elif type(values) != list and type(values) == int:
            request_body[key] = 0
        else:
            pass

def get_list(values):
    for rustle in values:
        if type(rustle) == list:
            get_list(values)
        else:
            get_targe_value(rustle)

def change_value_to_zero(item):
    result = copy.deepcopy(item)
    get_targe_value(result)
    return result

if __name__ == '__main__':
    dict2 = {"num_industries": {"9-汽车及零部件": [{"30-智能家电": "848645"}, {"11-激光装备": 2795}, {
        "30-智能家电": [{"30-智能家电": 9168}, {"11-激光装备": 2799}, {"30-智能家电": 9164}]}], "30-智能家电": 9163,
                                "11-激光装备": 2795, "12-膜材料": 1356, "32090001-集成电路": 416,
                                "29-畜禽和水产品精深加工": 6506, "8-功能玻璃": 7742, "19-化学纤维": 4668,
                                "32-造纸": 967,
                                "18-大数据+产业链": 10569, "27-绿色建材": 9407, "14-集成电路": 21250,
                                "24-纺织服装": 10802,
                                "28-半固态成型制造": 9210, "22-酿造(酒)": 8956, "32060001-南通光电": 0,
                                "23-食品加工": 10502, "10-生物医药": 745827, "31-网络可视化": 1205,
                                "26-高端家居": 10874,
                                "21-有机新材料": 12900, "20-晶硅光伏": 16825, "25-电子元器件": 14848,
                                "15-动力电池": 9595},
             "total_num": 26304548}
    dict1 = {"num_industries": {"9-汽车及零部件": [{"30-智能家电": 9168}, {"11-激光装备": 2799}, {
        "30-智能家电": [{"30-智能家电": 9148}, {"11-激光装备": 2793}, {"30-智能家电": 9134}]}], "30-智能家电": 9163,
                                "11-激光装备": 2795, "12-膜材料": 1356, "32090001-集成电路": 416,
                                "29-畜禽和水产品精深加工": 6506, "8-功能玻璃": 7742, "19-化学纤维": 4668,
                                "32-造纸": 967,
                                "18-大数据+产业链": 10569, "27-绿色建材": 9407, "14-集成电路": 21250,
                                "24-纺织服装": 10802,
                                "28-半固态成型制造": 9210, "22-酿造(酒)": 8956, "32060001-南通光电": 0,
                                "23-食品加工": 10502, "10-生物医药": 745827, "31-网络可视化": 1205,
                                "26-高端家居": 10874,
                                "21-有机新材料": 12900, "20-晶硅光伏": 16818, "25-电子元器件": 14848,
                                "15-动力电池": 9595},
             "total_num": 26304539}
    print(dict1)
    print(dict2)
    result = get_differences(dict1, dict2)
    print(result)

发表回复

您的电子邮箱地址不会被公开。