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

Python中如何高效比较两个Host对象列表,发现新主机与新开放端口?

高效对比主机列表:找出新增主机与新开放端口

你定义的Host类如下:

class Host:
    def __init__(self, ip):
        self.ip = ip
        self.ports = []

现有old_hosts和new_hosts两个Host对象列表,需要对比找出新增主机和已有主机上新开放的端口,替代低效的三层嵌套循环方案。

优化方案:用字典+集合实现高效对比

核心思路是把旧主机列表转换成以IP为键的字典,实现O(1)时间复杂度的IP查找;再用集合的差集操作快速找出新增端口,整体时间复杂度降到O(n+m)(n、m分别为新旧列表长度)。

具体代码实现

# 第一步:将旧主机列表转为IP到Host对象的映射字典
old_host_map = {host.ip: host for host in old_hosts}

# 第二步:遍历新主机列表,逐一对比差异
for new_host in new_hosts:
    # 查找旧列表中是否存在当前IP的主机
    matched_old_host = old_host_map.get(new_host.ip)
    
    if not matched_old_host:
        # 旧列表无对应IP,判定为新增主机
        print(f"New discovered host {new_host.ip}")
    else:
        # 用集合差集快速找出新增端口
        old_port_set = set(matched_old_host.ports)
        new_port_set = set(new_host.ports)
        added_ports = new_port_set - old_port_set
        
        for port in added_ports:
            print(f"New discovered port {port} on host {new_host.ip}")

方案优势

  • 字典查找替代了嵌套循环的IP匹配,避免了O(n*m)的时间开销;
  • 集合的差集操作比逐个遍历端口对比更高效,尤其是端口数量较多时;
  • 整体逻辑清晰,代码简洁易维护。

示例验证

用你给出的示例数据运行上述代码,会输出:

New discovered host 192.168.1.4
New discovered port 443 on host 192.168.1.2

完全符合预期结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:20:40