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
相关产品推荐
相关产品推荐

