两个字典列表中的匹配值
Matching values in two lists of dictionaries
船员,
我从我的两个开关中提取了以下两个字典列表。第一个来自我们的核心交换机,第二个来自 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,我只会看到列表中的最后一个词典。
以及 access_table 中的所有接口:
for y in [n['if'] for n in ex_table]:
print y
print n
这篇文章:Python - accessing values nested within dictionaries 似乎接近我的需要,但这依赖于一个词典列表中条目之间的关系。不是这种情况。
在将 mac 地址与 switch1_table 匹配时,我找不到迭代 core_table 的方法。如果 core_table 中的 mac 地址与 swicth1_table 中的 mac 地址匹配,我想打印 core_table 和 [=38= 的相应行] 的值 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 数据的方法。
欢迎提出任何建议。
for x in [m['mac'] for m in core_table]:
print x
print m
您不应尝试从外部访问 m
。参见 this。
List Comprehensions 的创建是为了简化事情并使代码更清晰。如果您在许多嵌套级别中使用它们,那么您就是在歪曲它们的用途。
对于 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 地址到字典,然后使用 table 提取 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'}
船员,
我从我的两个开关中提取了以下两个字典列表。第一个来自我们的核心交换机,第二个来自 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,我只会看到列表中的最后一个词典。
以及 access_table 中的所有接口:
for y in [n['if'] for n in ex_table]:
print y
print n
这篇文章:Python - accessing values nested within dictionaries 似乎接近我的需要,但这依赖于一个词典列表中条目之间的关系。不是这种情况。
在将 mac 地址与 switch1_table 匹配时,我找不到迭代 core_table 的方法。如果 core_table 中的 mac 地址与 swicth1_table 中的 mac 地址匹配,我想打印 core_table 和 [=38= 的相应行] 的值 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 数据的方法。
欢迎提出任何建议。
for x in [m['mac'] for m in core_table]: print x print m
您不应尝试从外部访问 m
。参见 this。
List Comprehensions 的创建是为了简化事情并使代码更清晰。如果您在许多嵌套级别中使用它们,那么您就是在歪曲它们的用途。 对于 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 地址到字典,然后使用 table 提取 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'}