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

