【发布时间】:2016-08-24 21:02:45
【问题描述】:
我希望比较两个字典。目标是找出之前存在哪些键,但之后不存在(丢失),以及在匹配键中更改了哪些值(已更改)
我有一个伪工作脚本,但问题是它没有显示更改后的键/值对所属的所有键。
import json
from pprint import pprint
def new_keys(d1, d2, result={}):
for key in d1.keys():
if not d2.has_key(key):
result[key] = d1[key]
else:
if isinstance(d1[key], dict) and isinstance(d2[key], dict):
new_keys(d1[key], d2[key], result)
else:
if d1[key] != d2[key]:
result[key] = d2[key]
return result
with open("before.json") as data_file:
before = json.loads(data_file.read())
with open("after.json") as data_file:
after = json.loads(data_file.read())
pprint(new_keys(before,after))
目前的结果是:
{u'1.1.1.1/32': {u'directlyConnected': True,
u'hardwareProgrammed': True,
u'kernelProgrammed': True,
u'routeAction': u'drop',
u'routeType': u'static',
u'vias': []},
我想要的示例结果是:(它是一个不同的路由 0.0.0.0/0 而不是 1.1.1.1/32)但请注意它嵌套在 vrfs,默认,路由键中。
{u'vrfs': {u'default': {u'allRoutesProgrammedHardware': True,
u'allRoutesProgrammedKernel': True,
u'defaultRouteState': u'reachable',
u'routes': {u'0.0.0.0/0': {u'directlyConnected': False,
u'hardwareProgrammed': True,
u'kernelProgrammed': True,
u'metric': 0,
u'preference': 1,
u'routeAction': u'forward',
u'routeType': u'static',
u'vias': [{u'interface': u'Management1',
u'nexthopAddr': u'10.31.32.1'}]},
我怀疑随着我的深入,我需要以某种方式跟踪密钥,但我很难正确编码。
非常感谢任何帮助!
编辑:示例 JSON
{
"vrfs": {
"default": {
"routes": {
"2.2.2.2/32": {
"kernelProgrammed": true,
"directlyConnected": true,
"routeAction": "forward",
"vias": [
{
"interface": "Ethernet4"
}
],
"hardwareProgrammed": true,
"routeType": "static"
}
},
"allRoutesProgrammedKernel": true,
"routingDisabled": false,
"allRoutesProgrammedHardware": true,
"defaultRouteState": "reachable"
}
}
}
之后 -
{
"vrfs": {
"default": {
"routes": {
"2.2.2.2/32": {
"kernelProgrammed": true,
"directlyConnected": true,
"routeAction": "forward",
"vias": [
{
"interface": "Ethernet9"
}
],
"hardwareProgrammed": true,
"routeType": "static"
}
},
"allRoutesProgrammedKernel": true,
"routingDisabled": false,
"allRoutesProgrammedHardware": true,
"defaultRouteState": "reachable"
}
}
}
接口值改变了。
【问题讨论】:
-
既然你想要嵌套字典,你不应该传递相同的
result字典。因此,对于每次调用new_keys(),您都应该传入一个新的resultdict,然后将值存储在调用者迭代中。如果您可以在 json 之前和之前发布示例可能会有所帮助 -
@WreckeR 我已经为之前/之后添加了示例 json 数据。这是我的第一个 python 脚本,所以如果您能向我展示示例代码来解释您的观点,将不胜感激。
标签: python json python-2.7 loops dictionary