Сопоставление значений в двух списках словарей


Экипаж,

Я вычленил следующие два списка словарей из двух моих переключателей. Первый от нашего основного коммутатора, второй от доступа "switch1". Чтобы получить более глубокое представление об этой сети, я хочу перекрестно ссылаться на эти два списка словарей.
core_table = [
{'ip': '172.17.2.1', 'mac': 'b8:27:eb:a3:24:a0', 'host': 'laptop', 'if': 'switch1'}, 
{'ip': '172.17.6.3', 'mac': '0c:89:10:88:20:3f', 'host': 'desktop', 'if': 'switch3'},
{'ip': '172.17.7.2', 'mac': 'b8:27:eb:a3:24:a3', 'host': 'server', 'if': 'switch1'}, 
{'ip': '172.17.6.2', 'mac': '0c:89:10:88:20:3f', 'host': 'storage', 'if': 'switch2'}
]

switch1_table = [
{'mac': '00:01:02:71:44:59', 'if': 'ge-1/0/6.0'},
{'mac': '00:06:73:00:c9:7a', 'if': 'ge-3/0/2.0'},
{'mac': 'b8:27:eb:a3:24:a0', 'if': 'ge-5/0/27.0'}, 
{'mac': '00:09:0f:09:1d:06', 'if': 'ae0.0'},
{'mac': '00:0a:07:05:1f:a4', 'if': 'ge-2/0/15.0'}, 
{'mac': '00:0b:4f:5d:09:ae', 'if': 'ge-2/0/19.0'},
{'mac': '00:0b:4f:d3:7b:3f', 'if': 'ge-1/0/18.0'}, 
{'mac': '00:0c:29:49:64:12', 'if': 'ae0.0'},
{'mac': '00:0e:ec:e8:18:50', 'if': 'ae0.0'}, 
{'mac': 'b8:27:eb:a3:24:a3', 'if': 'ge-0/0/44.0'}, 
{'mac': '00:15:17:93:aa:01', 'if': 'ae0.0'}
]

Я могу суммировать все mac-адреса в таблице core_table:

for x in [m['mac'] for m in core_table]:
     print x
     print m

Если я напечатаю m, я увижу только последний словарь в списке.

И точно так же все интерфейсы в access_table:

for y in [n['if'] for n in ex_table]:
      print y
      print n

Похоже, что эта статья: Python - доступ к значениям, вложенным в словари , близка к тому, что мне нужно, но это зависит от отношения между записями в одном списке словарей. Но это не так.

Я не могу найти способ перебирать core_table, сопоставляя MAC-адреса с switch1_table. Если MAC-адрес в core_table соответствует MAC-адрес в swicth1_table я хочу печатать соответствующей строке core_table и 'если' значение access_table. Чего бы я хотел добиться:

{'ip': '172.17.2.1', 'mac': 'b8:27:eb:a3:24:a0', 'host': 'laptop', 'if': 'switch1' 'port': 'ge-5/0/27.0'},
{'ip': '172.17.7.2', 'mac': 'b8:27:eb:a3:24:a3', 'host': 'server', 'if': 'switch1' 'port': 'ge-0/0/44.0'}

Я придумал: (спасибо: Питонский способ сравнения значений в двух списках словарей )

match = [x['mac'] for x in core_table if 'switch1' in x['if']]
print [x for x in switch1_table if x['mac'] in match]
Это приближает меня, но теперь я не могу найти способ добавить хост и ip-данные.

Любые предложения приветствуются.

2 2

2 ответа:

for x in [m['mac'] for m in core_table]:
     print x
     print m

Вы не должны пытаться получить доступ к m извне. Смотрите это .

Список пониманий был создан, чтобы упростить вещи и сделать код чище. Если вы используете их на многих вложенных уровнях, вы искажаете их назначение. Для Python 2.7.x

from copy import copy

result = []
for item in core_table:
    for item2 in swicth1_table:
        if item['mac'] == item2['mac']:
            new_item = copy(item)
            new_item['port'] = item2['if']
            result.append(new_item)

Вывод

{'port': 'ge-5/0/27.0', 'ip': '172.17.2.1', 'mac': 'b8:27:eb:a3:24:a0', 'host': 'laptop', 'if': 'switch1'}
{'port': 'ge-0/0/44.0', 'ip': '172.17.7.2', 'mac': 'b8:27:eb:a3:24:a3', 'host': 'server', 'if': 'switch1'}

Я бы сделал копию switch1_table в качестве словаря, сопоставляющего mac-адреса со словарями, а затем использовал бы эту таблицу для извлечения соответствующих строк core_table.

switch_dict = {v['mac']:v for v in switch1_table}
for c in core_table:
    if c['mac'] in switch_dict:
        print(dict(port=switch_dict[c['mac']]['if'], **c))

Отпечатки

{'ip': '172.17.2.1', 'host': 'laptop', 'if': 'switch1', 'mac': 'b8:27:eb:a3:24:a0', 'port': 'ge-5/0/27.0'}
{'ip': '172.17.7.2', 'host': 'server', 'if': 'switch1', 'mac': 'b8:27:eb:a3:24:a3', 'port': 'ge-0/0/44.0'}