2016-12-15 2 views
1

Экипаж,Соответствующие значения в двух списках словарей

Я дистиллировал следующие два списка словарей от двух моих переключателей. Первый из нашего основного коммутатора, второй - от доступа '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 

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

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

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

Кажется, что эта статья: Python - accessing values nested within dictionaries близка к тому, что мне нужно, но это зависит от соотношения между записями в одном списке словарей. Это не тот случай.

Я не могу найти способ итерации по core_table при сопоставлении адресов mac с коммутатором1_table. Если mac-адрес в core_table соответствует адресу mac в swicth1_table, я бы хотел напечатать соответствующую строку core_table AND значение «if» таблицы 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'} 

Я придумал: (Спасибо: Pythonic Way to Compare Values in Two Lists of Dictionaries)

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.

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

+0

Вы опечатка 'switch1_table' в своем определении –

+0

Патрик, я сделал. Спасибо. Я изменил это. – sandmouse

+0

Не мог бы кто-нибудь объяснить мне голос? Не только новичок на Python, но и пользователь StackExchange. – sandmouse

ответ

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

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

Список Пояснения были созданы, чтобы упростить ситуацию и превратить очиститель кода. Если вы используете их во многих вложенных уровнях, вы извращаете их цель. Для 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'} 
+0

Спасибо GustavoIP, я использовал ваше решение. Он работает нормально. Мне нужно больше изучать List Comprehensions, чтобы понять его полностью. – sandmouse

0

Я бы сделать копию 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'} 
+0

Спасибо, Патрик, что делает ** c? – sandmouse

+0

с 'd = {'a': 1, 'b': 2}', тогда вызов типа 'foo (** d)' эквивалентен 'foo (a = 1, b = 2)' –

Смежные вопросы