Python 在两个字典列表中匹配值

Python 在两个字典列表中匹配值,python,dictionary,nested,cross-reference,Python,Dictionary,Nested,Cross Reference,全体船员 我从我的两个开关中提取了以下两个字典列表。第一个来自我们的核心交换机,第二个来自访问“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

全体船员

我从我的两个开关中提取了以下两个字典列表。第一个来自我们的核心交换机,第二个来自访问“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_表中的所有mac地址:

for x in [m['mac'] for m in core_table]:
     print x
     print m
如果我打印m,我只看到列表中的最后一本词典

同样,access_表中的所有接口:

for y in [n['if'] for n in ex_table]:
      print y
      print n
这篇文章似乎很接近我所需要的,但这依赖于一个字典列表中条目之间的关系。事实并非如此

在将mac地址与switch1_表匹配时,我找不到迭代core_表的方法。如果core_表中的mac地址与swicth1_表中的mac地址匹配,我想打印core_表的相应行和access_表的“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'}
我想出了:(谢谢你:)

这让我很接近,但现在我找不到添加主机和ip数据的方法

欢迎提出任何建议

您不应尝试从外部访问
m
。看

创建列表理解是为了简化事情并使代码更清晰。如果在许多嵌套级别中使用它们,则会妨碍它们的用途。 对于Python2.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_表的副本,作为将mac地址映射到字典的字典,然后使用该表提取core_表的相关行

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

你把switch1\u表的定义拼错了Patrick,我错了。非常感谢。我改了。有人能给我解释一下反对票吗?不仅是Python初学者,还是StackExchange用户。谢谢GustavoIP,我使用了您的解决方案。它很好用。为了完全理解列表,我必须进一步研究列表的理解。如果item['mac']==item2['mac']不正确,是否可以添加一个回退选项?例如,如果您只想在没有匹配项的情况下复制core_表中的内容。我试过了,但是由于嵌套的循环,我得到了重复的条目。如果使用
d={'a':1,'b':2}
,那么像
foo(**d)
这样的调用相当于
foo(a=1,b=2)
我甚至会删除switch\u dict:中的
如果c['mac'],并将
print
行括在
try:keyrerror:
中。“请求原谅比得到允许更容易”
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'}