2016-12-15 5 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'} 
] 

나는 core_table의 모든 MAC 주소를 요약 할 수 있습니다

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

나는 인쇄 할 경우 나는이 목록에 마지막 사전을 볼 수 있어요. access_table에서

와 마찬가지로 모든 인터페이스 : Python - accessing values nested within dictionaries 내가 필요에 가까운 그러나 이것은 사전의 하나의 목록에서 항목 사이의 관계에 의존 :

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

은이 문서가 보인다. 그렇지 않다.

macaddress를 switch1_table과 일치시키면서 core_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

누군가 나에게 투표를 설명해 주시겠습니까? 파이썬에서 초보자 일뿐만 아니라 StackExchange 사용자이기도합니다. – sandmouse

답변

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

당신은 외부 m에 액세스하려고해서는 안된다. this을 참조하십시오.

목록 이해는 사물을 단순화하고 코드를 깨끗하게하기 위해 만들어졌습니다. 당신이 많은 중첩 된 수준에서 그들을 사용한다면 당신은 그들의 목적을 왜곡하고 있습니다. 파이썬 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) 

내가 사전에 사전 매핑 MAC 주소로 switch1_table의 복사본을 만들 것

{'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을 충분히 이해하기 위해서는 List Comprehensions을 더 공부해야합니다. – sandmouse

0

출력은 다음의 관련 행을 끌어 해당 테이블을 사용하여 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)'와 동일하다. –