【发布时间】:2017-07-14 11:37:10
【问题描述】:
我有两个要比较的嵌套字典 字典 d1 具有我从 yaml 文件中提取的所需值,d2 具有我从 aws 安全组获取的当前值。我想比较两个dict并显示
场景 1 d2 中存在但 d1 中没有的意外值
场景 2 并显示 d1 中存在但 d2 中不存在的值。
我现在有以下代码
def CompareDict(d1, d2, ctx=""):
for k in d2:
if k not in d1:
continue
if d2[k] != d1[k]:
if type(d2[k]) not in (dict, list):
print k +" Expected Value "+str(d1[k])+" but found "+str(d2[k])
else:
if type(d1[k]) != type(d2[k]):
continue
else:
if type(d2[k]) == dict:
CompareDict(d1[k], d2[k], k)
continue
elif type(d2[k]) == list:
CompareDict(list_to_dict(d1[k]), list_to_dict(d2[k]), k)
return
当我的两本字典是 -
时,这适用于以下场景D2
{u'SecurityGroups': [{u'IpPermissions': [{u'ToPort': 99, u'FromPort': 0, u'IpRanges': [{u'CidrIp': '104.129.192.69/32'}], u'IpProtocol': 'udp'}], u'IpPermissionsEgress': [{u'ToPort': 1, u'FromPort': 0, u'IpRanges': [], u'IpProtocol': 'tcp'}]}]}
D1
{u'SecurityGroups': [{u'IpPermissions': [{u'ToPort': 89, u'FromPort': 80, u'IpRanges': [{u'CidrIp': u'0.0.0.0/1'}], u'IpProtocol': u'tcp'}], u'IpPermissionsEgress': [{u'ToPort': 1, u'FromPort': 0, u'IpRanges': [{u'CidrIp': u'0.0.0.0/32'}], u'IpProtocol': u'tcp'}]}]}
输出
ToPort 预期值 89,但找到 99
FromPort 预期值 80,但找到 0
CidrIp 预期值 0.0.0.0/1 但找到 104.129.192.69/32
IpProtocol 期望值 tcp 但找到 udp
但是当我有两个 dict 时无法检查场景 2
--D2----
{u'SecurityGroups': [{u'IpPermissions': [{u'ToPort': 89, u'FromPort': 80, u'IpRanges': [], u'IpProtocol': 'tcp'}], u'IpPermissionsEgress': [{u'ToPort': 1, u'FromPort': 0, u'IpRanges': [], u'IpProtocol': 'tcp'}]}]}
——D1——
{u'SecurityGroups': [{u'IpPermissions': [{u'ToPort': 89, u'FromPort': 80, u'IpRanges': [{u'CidrIp': u'0.0.0.0/1'}], u'IpProtocol': u'tcp'}], u'IpPermissionsEgress': [{u'ToPort': 1, u'FromPort': 0, u'IpRanges': [{u'CidrIp': u'0.0.0.0/0'}], u'IpProtocol': u'tcp'}]}]}
输出
无
有人可以帮忙吗?我是 python 新手,非常感谢任何帮助
更新 -
场景 3(未能检测到 cidrIp 值的变化,因为它在 D2 中为“0.0.0.0/0”,在 D1 中为“0.0.0.0/1”。)
D2
{u'SecurityGroups': [{u'IpPermissions': [{u'ToPort': 89, u'FromPort': 80, u'IpRanges': [{u'CidrIp': '0.0.0.0/0'}], u'IpProtocol': 'tcp'}], u'IpPermissionsEgress': [{u'ToPort': 1, u'FromPort': 0, u'IpRanges': [{u'CidrIp': '0.0.0.0/32'}], u'IpProtocol': 'tcp'}]}]}
D1
{u'SecurityGroups': [{u'IpPermissions': [{u'ToPort': 89, u'FromPort': 80, u'IpRanges': [{u'CidrIp': u'0.0.0.0/1'}], u'IpProtocol': u'tcp'}], u'IpPermissionsEgress': [{u'ToPort': 1, u'FromPort': 0, u'IpRanges': [{u'CidrIp': u'0.0.0.0/32'}], u'IpProtocol': u'tcp'}]}]}
输出:
【问题讨论】:
标签: python python-2.7 amazon-web-services dictionary