You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}")

错误原因与修正说明

  1. 原代码错误点:

    • 找到匹配IP对应的端口后,未限制设备范围,会把所有设备中同端口的IP都关联到当前节点,导致跨设备的错误关联。
    • 嵌套循环过多,效率低下,且重复添加不必要的条目到中间列表。
  2. 修正思路:

    • 提前构建ip_to_port_device映射,通过IP直接获取对应的端口和设备,避免多次遍历查找。
    • 提前构建device_port_ips映射,按(设备,端口)分组存储所有对应IP,快速获取同一设备同端口的IP列表。
    • 遍历ip_per_node,直接通过映射获取所需数据,生成预期格式的输出,逻辑清晰且效率更高。

内容的提问来源于stack exchange,提问作者Saeed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:44:53