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

Python3判断IP归属子网时扫描结果总数缺失问题求助

问题排查

总长度不符的根因

你的scanned变量经过了list(set(scanned))去重处理,如果原始subnets列表本身存在重复的子网条目,去重后的scanned只会保留1份重复条目,后续notscanned筛选时会把所有重复条目都排除,最终scanned + notscanned的总长度就会小于原始subnets的长度。你示例中总长度少了3,刚好对应subnets里有3个重复的子网条目。
你可以执行print(len(set(subnets)))验证,如果输出为97即可确认该问题。

现有逻辑的其他严重错误

你用if(ip in subnet)做判断是完全错误的:这是字符串包含判断,不是IP归属子网的网络判断。比如子网为172.0.0.0/24、IP为172.0.0.1时,字符串判断结果为False,完全达不到你的筛选要求。

修正后的完整代码

import ipaddress

# 提前将字符串转为对应标准对象,strict=False允许非网络地址开头的子网输入
ip_list = [ipaddress.ip_address(ip.strip()) for ip in ips]
subnet_list = [ipaddress.ip_network(net.strip(), strict=False) for net in subnets]

# 先对子网去重,保证后续统计总长度准确
unique_subnets = list(set(subnet_list))
scanned_subnets = set()

for ip in ip_list:
    for subnet in unique_subnets:
        if ip in subnet:
            scanned_subnets.add(subnet)
            # 匹配到即跳出循环,避免无效遍历
            break

not_scanned_subnets = [net for net in unique_subnets if net not in scanned_subnets]
# 此时 len(scanned_subnets) + len(not_scanned_subnets) = len(unique_subnets),总长度一致

性能优化建议

如果IP和子网的量级较大,可以用前缀树(CIDR树)替代双层循环,将时间复杂度从O(nm)降低到O(nlogm),提升运行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:24:06