2016-12-15 63 views
1

乘員組,匹配兩個字典列表中的值

我從兩個交換機中提取了以下兩個字典列表。第一個來自我們的核心交換機,第二個來自access'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'} 
] 

我可以在core_table總結所有MAC地址:

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

如果我打印M I看到的只是最後的字典在列表中。

並且同樣都在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地址與switch1_table進行匹配。如果core_table中的mac地址與swicth1_table中的mac地址匹配,我想打印core_table的相應行和access_table的「if」值。我想什麼來實現:

{'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

你已經在其定義 –

+0

帕特里克拼錯'switch1_table',我做到了。謝謝。我改變了它。 – 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,我用過你的解決方案。它工作正常。我必須更多地學習列表理解,以充分理解它。 – 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

謝謝Patrick,** c做了什麼? – sandmouse

+0

與'd = {'a':1,'b':2}',那麼像'foo(** d)'這樣的調用等同於'foo(a = 1,b = 2)' –