遍历字典以获取值

时间:2020-04-16 14:26:12

标签: python python-3.x python-2.7

我有一个正在使用的字典,我想遍历它,并在“ 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)

2 个答案:

答案 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']