【发布时间】: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