如何从Arista交换机嵌套字典提取接口名与actorPortPriority
解决Arista交换机嵌套字典的接口信息提取问题
看了你的问题和数据样本,问题出在你没搞清楚嵌套字典的层级关系——你拿到的interfaces本身是一个以接口名为键的字典,而不是直接包含actorPortPriority的字典,所以直接访问v['interfaces']['actorPortPriority']肯定会报错。
咱们一步步来拆解:
- 你的原始数据是多个字典组成的列表(每个字典对应一组接口数据)
- 每个字典里的
interfaces键,对应的值又是一个新字典:键是接口名(比如Ethernet29/1),值是该接口的详细信息(包含actorPortPriority)
正确的遍历代码示例
首先把你的三个数据字典放进一个列表里(实际场景中,Arista的API返回应该就是这样的列表结构),然后逐层遍历:
# 把你的样本数据整理成列表 data_list = [ {'interfaces': {'Ethernet29/1': {'actorOperKey': '0x00c8', 'actorPortId': 117, 'actorPortPriority': 32768, 'actorPortState': {'activity': True, 'aggregation': True, 'collecting': True, 'defaulted': False, 'distributing': True, 'expired': False, 'synchronization': True, 'timeout': False}, 'actorPortStatus': 'bundled', 'partnerOperKey': '0x82af', 'partnerPortId': 16643, 'partnerPortPriority': 32768, 'partnerPortState': {'activity': True, 'aggregation': True, 'collecting': True, 'defaulted': False, 'distributing': True, 'expired': False, 'synchronization': True, 'timeout': False}, 'partnerSysId': '7F9B,00-23-04-ee-be-cc'}, 'Ethernet30/1': {'actorOperKey': '0x00c8', 'actorPortId': 121, 'actorPortPriority': 32768, 'actorPortState': {'activity': True, 'aggregation': True, 'collecting': True, 'defaulted': False, 'distributing': True, 'expired': False, 'synchronization': True, 'timeout': False}, 'actorPortStatus': 'bundled', 'partnerOperKey': '0x82af', 'partnerPortId': 259, 'partnerPortPriority': 32768, 'partnerPortState': {'activity': True, 'aggregation': True, 'collecting': True, 'defaulted': False, 'distributing': True, 'expired': False, 'synchronization': True, 'timeout': False}, 'partnerSysId': '7F9B,00-23-04-ee-be-cc'}}, 'markers': {'markers': ['*']}}, {'interfaces': {'Ethernet16/1': {'actorOperKey': '0x0385', 'actorPortId': 65, 'actorPortPriority': 32768, 'actorPortState': {'activity': True, 'aggregation': True, 'collecting': True, 'defaulted': False, 'distributing': True, 'expired': False, 'synchronization': True, 'timeout': False}, 'actorPortStatus': 'bundled', 'partnerOperKey': '0x0001', 'partnerPortId': 49, 'partnerPortPriority': 32768, 'partnerPortState': {'activity': True, 'aggregation': True, 'collecting': True, 'defaulted': False, 'distributing': True, 'expired': False, 'synchronization': True, 'timeout': False}, 'partnerSysId': '8000,28-99-3a-fa-50-fc'}}, 'markers': {'markers': ['*']}}, {'interfaces': {'Ethernet11/1': {'actorOperKey': '0x0067', 'actorPortId': 45, 'actorPortPriority': 0, 'actorPortState': {'activity': False, 'aggregation': True, 'collecting': False, 'defaulted': True, 'distributing': False, 'expired': False, 'synchronization': False, 'timeout': False}, 'actorPortStatus': 'noAgg', 'partnerOperKey': '0x0000', 'partnerPortId': 0, 'partnerPortPriority': 0, 'partnerPortState': {'activity': False, 'aggregation': False, 'collecting': False, 'defaulted': False, 'distributing': False, 'expired': False, 'synchronization': False, 'timeout': True}, 'partnerSysId': '0000,00-00-00-00-00-00'}, 'Ethernet11/2': {'actorOperKey': '0x0067', 'actorPortId': 46, 'actorPortPriority': 32768, 'actorPortState': {'activity': False, 'aggregation': True, 'collecting': False, 'defaulted': True, 'distributing': False, 'expired': False, 'synchronization': False, 'timeout': False}, 'actorPortStatus': 'noAgg', 'partnerOperKey': '0x0000', 'partnerPortId': 0, 'partnerPortPriority': 0, 'partnerPortState': {'activity': False, 'aggregation': False, 'collecting': False, 'defaulted': False, 'distributing': False, 'expired': False, 'synchronization': False, 'timeout': True}, 'partnerSysId': '0000,00-00-00-00-00-00'}}, 'markers': {'markers': ['*']}} ] # 遍历每个数据条目 for entry in data_list: # 取出当前条目的接口字典 interface_dict = entry['interfaces'] # 遍历每个接口的名称和详情 for if_name, if_details in interface_dict.items(): # 提取目标字段 priority = if_details['actorPortPriority'] print(f"接口: {if_name}, actorPortPriority: {priority}")
运行结果
执行后会输出:
接口: Ethernet29/1, actorPortPriority: 32768 接口: Ethernet30/1, actorPortPriority: 32768 接口: Ethernet16/1, actorPortPriority: 32768 接口: Ethernet11/1, actorPortPriority: 0 接口: Ethernet11/2, actorPortPriority: 32768
扩展:把结果保存为结构化列表
如果需要后续处理,可以把结果存成列表字典:
result = [] for entry in data_list: for if_name, if_details in entry['interfaces'].items(): result.append({ 'interface_name': if_name, 'actor_port_priority': if_details['actorPortPriority'] }) # 打印结构化结果 for item in result: print(item)
这样就能清晰地提取到你需要的所有接口名和对应的actorPortPriority了。
内容的提问来源于stack exchange,提问作者lamaGra
相关产品推荐
相关产品推荐

