Цикл по словарю, чтобы получить значения - PullRequest
0 голосов
/ 16 апреля 2020

У меня есть диктант, с которым я работаю, и я бы хотел через него пройти l oop и вывести значения для 'network' как 'process-id', так и process-id-vrf '. Я не могу заставить его тянуть оба, только один или другой. Может кто-нибудь дать мне несколько советов о том, как сделать эту работу. Вот вывод из 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 голосов
/ 16 апреля 2020

Хорошо, обо всем по порядку:

1 / Python Все объекты имеют значение истинности в логическом контексте. Для встроенных типов числовой ноль, пустые контейнеры и пустая строка имеют значение false.

2 / логические операторы 'и' и 'или' не возвращают логическое значение, но для 'и' последний операнд, если оба являются истинными, иначе второй операнд, для 'или' первый операнд это не ложь, иначе последний операнд.

Так вот:

in ospf_protocol['process-id'] or ospf_protocol['process-id-vrf']

не делает то, что вы ожидаете - он первый оценивает ospf_protocol['process-id'] or ospf_protocol['process-id-vrf'], и вернуть первый из тех объектов, которые не являются пустыми (или последний, если оба они пусты).

Теперь ваш фрагмент кода не является правильным минимальным воспроизводимым примером , и мы не делаем точно знать, что это за типы 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 / use 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 l oop, повторяющийся над tuple, составленный из обоих ie:

for processe in (ospf_protocol['process-id'],  ospf_protocol['process-id-vrf']):
    for item in processes:
        print(item)

Я не могу, конечно, гарантировать результат, так как, ну, я не действительно точно знаю, что ваши данные л Да, но ты не можешь обвинить меня в этом; -)

0 голосов
/ 16 апреля 2020

Если я правильно понимаю, что вы пытаетесь, вам не нужно l oop сверх диктанта. Больше похоже на ospf_protocol['process-id']['network'] и ospf_protocol['process-id-vrf']['network']

...