【问题标题】:substract values of two nested dictionary python减去两个嵌套字典python的值
【发布时间】:2016-12-11 18:34:20
【问题描述】:

我需要获取两个嵌套字典的增量:

我正在使用类似的函数来获取嵌套字典

def _get_data(self):
    duplicates = defaultdict(list) # to append tuples into a dictionary
    counter_dict = AutoVivification()
    vpls_dict = AutoVivification()

    fpcs = self._get_slot_fpcs_online()
    pattern = "GOT:\s+(\d+).*([0-9A-F]{2,2}\:[0-9A-F]{1,2}\:[0-9A-F]{1,2}\:[0-9A-F]{1,2}\:[0-9A-F]{1,2}\:[0-9A-F]{1,2})\s+\d{4}\s+(\d\s+\d).*(\d\s+\d+/\d+)"
    regex = re.compile(pattern,re.IGNORECASE)

    for i in fpcs:
        if i == '11':
            for pfe in range(2):
                cmd = self._conn.rpc.request_pfe_execute(target='fpc' + str(i),command='show l2metro '+str(pfe)+' mac hw')                  
                cmd_str = etree.tostring(cmd)
                for x in regex.findall(cmd_str):
                    if x[2] =='0   0' and x[3] != '7 255/255':  
                        duplicates[i].append(x)
        else:
            cmd = self._conn.rpc.request_pfe_execute(target='fpc' + str(i),command='show l2metro 0 mac hw') 
            cmd_str = etree.tostring(cmd)
            for x in regex.findall(cmd_str):
                if x[2] =='0   0' and x[3] != '7 255/255':  
                    duplicates[i].append(x)

    for k,v in duplicates.iteritems():
        for j in v:
            cmd_vpls = self._conn.rpc.get_l2_learning_routing_instances()
            vpls_instance = ''.join(cmd_vpls.xpath("//l2ald-rtb-entry[l2rtb-id=" + '"' + str(j[0]) + '"'"]/l2rtb-name//text()")[0])
            vpls_dict[k][j[1]][j[3]][j[0]][vpls_instance] = self._conn.cli('show configuration routing-instances '+ vpls_instance + ' forwarding-options family vpls filter',warning=False).split('\n')[1].replace('input','').replace(';','')
            counter_cmd = self._conn.rpc.get_firewall_filter_information(filtername=str(vpls_dict[k][j[1]][j[3]][j[0]][vpls_instance]).strip())
            counter_dict[k][j[1]][j[3]][vpls_instance][vpls_dict[k][j[1]][j[3]][j[0]][vpls_instance].strip()] = ''.join(counter_cmd.xpath('./filter-information/policer/packet-count//text()')).replace('\n','')
    return counter_dict

counter_dict 结果如下:

{'10': {'00:07:72:9d:dc:4c': {'0 255/255': {'128379': {'CDALJ1/17223002010': '91304'}}}, '00:0f:bb:fa:25:fd': {'0 255/255': {'232367': {'CDALJ1/14100001093228': '1585097'}}}, '00:1b:c0:f2:f4:fa': {'0 255/255': {'156420': {'CDALJ1/08903762011': '0'}, '166980': {'CDALJ1/19369922011': '0'}}}, '88:e0:f3:61:d8:01': {'0 255/255': {'182099': {'CDALJ1/11274452012': '0'}}}, 'ec:13:db:0a:95:01': {'0 255/255': {'182099': {'CDALJ1/11274452012': '0'}}}},

'11': {'00:00:0c:07:ac:75': {'0 255/255': {'232173': {'CDALJ1/14100001093242': '0'}}}, '00:00:0c:07:ac:f5': {'0 255/255': {'293667': {'CDALJ1/14100001095054': '2723092'}}}, '00:00:0c:07:ac:f6': {'0 255/255': {'298967': {'CDALJ1/14100001095106': '0'}}}, '00:00:0c:07:ac:f7': {'0 255/255': {'298969': {'CDALJ1/14100001095107': '0'}}}, '00:07:72:9d:dc:4c': {'0 255/255': {'128379': {'CDALJ1/17223002010': '91304'}}}

[……]

我正在尝试获得内部价值保持字典结构的增量:

mac_dict1 = _get_data()

{'10': {'00:07:72:9d:dc:4c': {'0 255/255': {'128379': {'CDALJ1/17223002010': '91304'}}}, '00:0f:bb:fa:25:fd': {'0 255/255': {'232367': {'CDALJ1/14100001093228': '1585097'}}}

睡眠5

mac_dict2 = _get_data()

{'10': {'00:07:72:9d:dc:4c': {'0 255/255': {'128379': {'CDALJ1/17223002010': '91310'}}}, '00:0f:bb:fa:25:fd': {'0 255/255': {'232367': {'CDALJ1/14100001093228': '1585100'}}}

结果 = get_diff(mac_dict1,mac_dict2)

result 应该提供这样的结果:

{'10': {'00:07:72:9d:dc:4c': {'0 255/255': {'128379': {'CDALJ1/17223002010': '6'}}}, '00:0f:bb:fa:25:fd': {'0 255/255': {'232367': {'CDALJ1/14100001093228': '3'}}}

您能否向我提供有关如何执行此操作的任何提示或提示(不是代码)?

谢谢

【问题讨论】:

  • 确实有可能。
  • 我投票决定将此问题作为题外话结束,因为 SO 不是代码编写服务。
  • 如果您想得到正确的答案,最好用您目前尝试过的代码更新您的问题,并告诉我们您的代码遇到的问题。跨度>
  • 不反对,但如果这不是问题的一部分,我会看到“获取嵌套字典”的代码让我有点恼火。您拥有的 dicts(在代码块中)和您期望的结果,就像您正在做的那样,足以让您明白这一点。这甚至是一个有趣的问题,就像 niemmi 的回答一样。

标签: python dictionary nested


【解决方案1】:

您可以使用简单的递归函数来做到这一点,它将 str 值转换为 int 并在 dict 的情况下进行减法或递归:

def subtract(x, y):
    if isinstance(x, dict) and isinstance(y, dict):
        return {key: subtract(x[key], y[key]) for key in x if key in y}
    else:
        return str(int(x) - int(y))

使用给定的输入运行它:

d1 = {
    '10': {
        '00:07:72:9d:dc:4c': {'0 255/255': {'128379': {'CDALJ1/17223002010': '91304'}}},
        '00:0f:bb:fa:25:fd': {'0 255/255': {'232367': {'CDALJ1/14100001093228': '1585097'}}}
    }
}
d2 = {
    '10': {
        '00:07:72:9d:dc:4c': {'0 255/255': {'128379': {'CDALJ1/17223002010': '91310'}}},
        '00:0f:bb:fa:25:fd': {'0 255/255': {'232367': {'CDALJ1/14100001093228': '1585100'}}}
    }
}

print subtract(d2, d1)

格式化输出:

{
    '10': {
        '00:07:72:9d:dc:4c': {'0 255/255': {'128379': {'CDALJ1/17223002010': '6'}}}, 
        '00:0f:bb:fa:25:fd': {'0 255/255': {'232367': {'CDALJ1/14100001093228': '3'}}}
    }
}

请注意,如果您的输入包含除 dictstr 之外的任何其他类型的值(应解释为 int),则示例代码将失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多