我有一个正在使用的字典,我想遍历它,并在“ process-id”和“ process-id-vrf”下提取“ network”的值。我似乎无法将两者拉开,只能拉开其中一个。有人可以给我一些有关如何使这项工作的建议。这是ospf_protocol.items()的输出,因此您可以看到结构。
dict_items([('process-id', [{'id': 2, 'area': [{'area-id': 0, 'authentication': {'message-digest': [None]}}], 'network': [{'ip': '192.168.200.0', 'wildcard': '0.0.0.255', 'area': 0}]}]), ('process-id-vrf', [{'id': 1, 'vrf': 'army', 'area': [{'area-id': 0, 'authentication': {'message-digest': [None]}}], 'network': [{'ip': '192.1.1.1', 'wildcard': '0.0.0.0', 'area': 0}, {'ip': '192.168.100.1', 'wildcard': '0.0.0.0', 'area': 0}], 'router-id': '192.1.1.1'}])])
for network_statement in ospf_protocol['process-id'] or ospf_protocol['process-id-vrf']:
for ospf_network in network_statement['network']:
ospf_interface = ospf_network['ip']
ospf_wildcard = ospf_network['wildcard']
# determine netmask and network address for valid ospf enabled interfaces
wildcard_to_mask = str(ipaddress.ip_network(ospf_interface+'/'+ospf_wildcard, strict=False).netmask)
if wildcard_to_mask == '0.0.0.0':
wildcard_to_mask = '255.255.255.255'
ospf_int_range = ipaddress.ip_interface(ospf_interface+'/'+wildcard_to_mask)
else:
ospf_int_range = ipaddress.ip_interface(ospf_interface+'/'+wildcard_to_mask)
答案 0 :(得分:0)
好吧,首先要做的是
1 / Python对象在布尔上下文中都具有真值。对于内置类型,数字零,空容器和空字符串均为false。
2 /逻辑运算符'and'和'or'不返回布尔值,但对于'and',如果最后一个操作数都为true,则返回第二个操作数,对于'or'第一个操作数不返回布尔值false,否则为最后一个操作数。
所以这个:
in ospf_protocol['process-id'] or ospf_protocol['process-id-vrf']
不执行您期望的操作-它第一个求值ospf_protocol['process-id'] or ospf_protocol['process-id-vrf']
,然后返回那些不为空的对象的第一个(如果两个都为空,则返回最后一个)。 / p>
现在您的代码段不是正确的minimal reproducible example,并且我们不确定ospf_protocol['process-id']
和ospf_protocol['process-id-vrf']
是什么类型,但是假设它们是字典列表,则可以
1 /将它们串联:
all_processes = ospf_protocol['process-id'] + ospf_protocol['process-id-vrf']
for item in all_processes:
print(item)
2 /使用itertools.chain()
避免建立新列表(仅当这些列表很大时才有意义):
import itertools
all_protocols = itertools.chain(ospf_protocol['process-id'], ospf_protocol['process-id-vrf'])
for item in all_protocols:
print(item)
3 /或只是简单地添加第一个for
循环,在由两者组成的tuple
上进行迭代,即:
for processe in (ospf_protocol['process-id'], ospf_protocol['process-id-vrf']):
for item in processes:
print(item)
我当然不能保证结果,因为,我不确定真的知道您的数据是什么样子,但是对此您不能责怪我; -)
答案 1 :(得分:-2)
如果我正确理解您要执行的操作,则无需遍历该字典。
更多类似ospf_protocol['process-id']['network']
和ospf_protocol['process-id-vrf']['network']