Python根据接口号合并嵌套列表中同INTF字段字典的实现问题
解决思路
- 首先建立接口类型缩写到全称的映射,保证同一类接口的类型标识统一
- 编写辅助函数拆分接口名称,提取接口类型+编号作为唯一匹配键
- 展平嵌套列表,遍历所有接口字典,按键分组合并字典
- 最后将合并后的字典转为列表输出
实现代码
# 接口缩写到全称的映射,可根据实际接口类型扩展 intf_type_map = { 'Vl': 'Vlan', 'Fa': 'FastEthernet', 'Gi': 'GigabitEthernet', 'Te': 'TenGigabitEthernet' } def get_intf_key(intf_name): # 拆分接口名的前缀和数字部分 prefix = [] num = [] for c in intf_name: if c.isalpha(): prefix.append(c) else: num.append(c) prefix = ''.join(prefix) num = ''.join(num) # 归一化前缀为全称 norm_prefix = intf_type_map.get(prefix, prefix) # 返回统一键:(归一化类型, 接口编号) return (norm_prefix, num) # 原始数据 a = [ [ {'DESCRIP': '', 'INTF': 'Vl77', 'PROTOCOL': 'up', 'STATUS': 'up'}, {'DESCRIP': '', 'INTF': 'Fa0', 'PROTOCOL': 'down', 'STATUS': 'admin down'} ], [ {'INBOUND_ACL': '', 'INTF': 'Vlan77', 'IPADDR': ['192.168.77.11/24'], 'IP_HELPER': [], 'LINK_STATUS': 'up', 'MTU': '1500', 'OUTGOING_ACL': '', 'PROTOCOL_STATUS': 'up', 'VRF': ''}, {'INBOUND_ACL': '', 'INTF': 'FastEthernet0', 'IPADDR': [], 'IP_HELPER': [], 'LINK_STATUS': 'administratively down', 'MTU': '', 'OUTGOING_ACL': '', 'PROTOCOL_STATUS': 'down', 'VRF': ''} ] ] # 存储合并结果的临时字典 merged = {} # 展平嵌套列表遍历所有接口字典 for sublist in a: for intf_dict in sublist: # 过滤没有INTF字段的字典 if 'INTF' not in intf_dict: continue intf_key = get_intf_key(intf_dict['INTF']) if intf_key not in merged: merged[intf_key] = {} # 合并字典,后续的键值会覆盖前面重复的键 merged[intf_key].update(intf_dict) # 转为列表格式输出 new_dict = list(merged.values()) print(new_dict)
代码说明
- 接口映射表可以根据实际业务中遇到的接口类型自行扩展,比如增加Eth、Trunk等类型的映射
- 合并逻辑默认用后出现的字典的键值覆盖先出现的重复键,符合示例中保留全称INTF的需求,如果需要调整优先级可以修改遍历顺序
- 自动过滤没有INTF字段的字典,避免运行报错
内容的提问来源于stack exchange,提问作者Dover
相关产品推荐
相关产品推荐

