Python字典列表IP与端口匹配代码逻辑修复求助
问题描述
编写Python代码实现以下逻辑:当ip_per_node列表中字典的ip_address与ip_port_device列表中字典的ip匹配时,找出ip_port_device中同一设备下拥有相同port_number的所有IP,并按指定格式聚合输出。当前代码存在逻辑错误,会重复为所有节点保存同一端口的跨设备信息,无法得到预期输出。
原代码
from collections import defaultdict ip_port_device = [ {'ip': '192.168.1.140', 'port_number': 4, 'device_name': 'device1'}, {'ip': '192.168.1.128', 'port_number': 8, 'device_name': 'device1'}, {'ip': '192.168.1.56', 'port_number': 14, 'device_name': 'device1'}, {'ip': '192.168.1.61', 'port_number': 4, 'device_name': 'device1'}, {'ip': '192.168.1.78', 'port_number': 8, 'device_name': 'device1'}, {'ip': '192.168.1.13', 'port_number': 16, 'device_name': 'device1'}, {'ip': '192.168.2.140', 'port_number': 4, 'device_name': 'device2'}, {'ip': '192.168.2.128', 'port_number': 8, 'device_name': 'device2'}, {'ip': '192.168.2.56', 'port_number': 14, 'device_name': 'device2'}, {'ip': '192.168.2.61', 'port_number': 4, 'device_name': 'device2'}, {'ip': '192.168.2.78', 'port_number': 8, 'device_name': 'device2'}, {'ip': '192.168.2.13', 'port_number': 16, 'device_name': 'device2'}, {'ip': '192.168.3.140', 'port_number': 4, 'device_name': 'device3'}, {'ip': '192.168.3.128', 'port_number': 8, 'device_name': 'device3'}, {'ip': '192.168.3.56', 'port_number': 14, 'device_name': 'device3'}, {'ip': '192.168.3.61', 'port_number': 4, 'device_name': 'device3'}, {'ip': '192.168.3.78', 'port_number': 8, 'device_name': 'device3'}, {'ip': '192.168.3.13', 'port_number': 16, 'device_name': 'device3'}, ] ip_per_node = [ {'node_name': 'server9.example.com', 'ip_address': '192.168.1.140'}, {'node_name': 'server19.example.com', 'ip_address': '192.168.1.128'}, {'node_name': 'server11.example.com', 'ip_address': '192.168.2.140'}, {'node_name': 'server21.example.com', 'ip_address': '192.168.2.128'}, {'node_name': 'server17.example.com', 'ip_address': '192.168.3.140'}, {'node_name': 'server6.example.com', 'ip_address': '192.168.3.128'}, ] ips_and_ports_in_switch = [] for compute in ip_per_node: for port in ip_port_device: if compute['ip_address'] == port['ip']: port = port['port_number'] for new_port in ip_port_device: if port == new_port['port_number']: ips_and_ports_in_switch.append({ 'port_number': new_port['port_number'], 'ip_address': new_port['ip'], 'node_name': compute['node_name'], 'device_name': new_port['device_name'] }) concatenated = defaultdict(list) for entry in ips_and_ports_in_switch: concatenated[(entry['device_name'], entry['port_number'], entry['node_name'])].append(entry['ip_address'])
预期输出
node server9.example.com, port 4, device device1, ips ['192.168.1.140', '192.168.1.61'] node server19.example.com, port 8, device device1, ips ['192.168.1.128', '192.168.1.78'] node server11.example.com, port 4, device device2, ips ['192.168.2.140', '192.168.2.61'] node server21.example.com, port 8, device device2, ips ['192.168.2.128', '192.168.2.78'] node server17.example.com, port 4, device device3, ips ['192.168.3.140', '192.168.3.61'] node server6.example.com, port 8, device device3, ips ['192.168.3.128', '192.168.3.78']
修正后的代码
from collections import defaultdict ip_port_device = [ {'ip': '192.168.1.140', 'port_number': 4, 'device_name': 'device1'}, {'ip': '192.168.1.128', 'port_number': 8, 'device_name': 'device1'}, {'ip': '192.168.1.56', 'port_number': 14, 'device_name': 'device1'}, {'ip': '192.168.1.61', 'port_number': 4, 'device_name': 'device1'}, {'ip': '192.168.1.78', 'port_number': 8, 'device_name': 'device1'}, {'ip': '192.168.1.13', 'port_number': 16, 'device_name': 'device1'}, {'ip': '192.168.2.140', 'port_number': 4, 'device_name': 'device2'}, {'ip': '192.168.2.128', 'port_number': 8, 'device_name': 'device2'}, {'ip': '192.168.2.56', 'port_number': 14, 'device_name': 'device2'}, {'ip': '192.168.2.61', 'port_number': 4, 'device_name': 'device2'}, {'ip': '192.168.2.78', 'port_number': 8, 'device_name': 'device2'}, {'ip': '192.168.2.13', 'port_number': 16, 'device_name': 'device2'}, {'ip': '192.168.3.140', 'port_number': 4, 'device_name': 'device3'}, {'ip': '192.168.3.128', 'port_number': 8, 'device_name': 'device3'}, {'ip': '192.168.3.56', 'port_number': 14, 'device_name': 'device3'}, {'ip': '192.168.3.61', 'port_number': 4, 'device_name': 'device3'}, {'ip': '192.168.3.78', 'port_number': 8, 'device_name': 'device3'}, {'ip': '192.168.3.13', 'port_number': 16, 'device_name': 'device3'}, ] ip_per_node = [ {'node_name': 'server9.example.com', 'ip_address': '192.168.1.140'}, {'node_name': 'server19.example.com', 'ip_address': '192.168.1.128'}, {'node_name': 'server11.example.com', 'ip_address': '192.168.2.140'}, {'node_name': 'server21.example.com', 'ip_address': '192.168.2.128'}, {'node_name': 'server17.example.com', 'ip_address': '192.168.3.140'}, {'node_name': 'server6.example.com', 'ip_address': '192.168.3.128'}, ] # 构建IP到(port_number, device_name)的映射,快速查找对应端口和设备 ip_to_port_device = {item['ip']: (item['port_number'], item['device_name']) for item in ip_port_device} # 按(设备名称, 端口号)分组存储对应IP列表 device_port_ips = defaultdict(list) for item in ip_port_device: key = (item['device_name'], item['port_number']) device_port_ips[key].append(item['ip']) # 生成预期格式的输出 for node in ip_per_node: ip = node['ip_address'] port_num, device = ip_to_port_device[ip] ips_list = device_port_ips[(device, port_num)] print(f"node {node['node_name']}, port {port_num}, device {device}, ips {ips_list}")
错误原因与修正说明
原代码错误点:
- 找到匹配IP对应的端口后,未限制设备范围,会把所有设备中同端口的IP都关联到当前节点,导致跨设备的错误关联。
- 嵌套循环过多,效率低下,且重复添加不必要的条目到中间列表。
修正思路:
- 提前构建
ip_to_port_device映射,通过IP直接获取对应的端口和设备,避免多次遍历查找。 - 提前构建
device_port_ips映射,按(设备,端口)分组存储所有对应IP,快速获取同一设备同端口的IP列表。 - 遍历
ip_per_node,直接通过映射获取所需数据,生成预期格式的输出,逻辑清晰且效率更高。
- 提前构建
内容的提问来源于stack exchange,提问作者Saeed
相关产品推荐
相关产品推荐

