如何向IP子网转IP范围函数传入子网列表并获取正确结果?
解决子网IP转IP范围的列表处理问题
核心问题分析
- 原函数仅支持单个CIDR格式字符串,无法直接处理列表
- 你提供的输入列表元素不是合法CIDR格式(合法CIDR应为
x.x.x.x/掩码形式,比如187.11.62.92/30) - 你尝试的列表推导式逻辑错误,无法直接遍历字符串列表解构出IP范围
解决方案一:处理标准CIDR列表
如果你的输入是标准CIDR格式的列表,可通过以下方式实现:
方式1:修改函数支持单个CIDR或列表
import ipaddress def get_ip_ranges(cidr_input): # 处理单个CIDR字符串 if isinstance(cidr_input, str): # strict=False允许非网络地址的IP作为CIDR输入 net = ipaddress.ip_network(cidr_input, strict=False) return (net[0], net[-1]) # 处理CIDR列表 elif isinstance(cidr_input, list): result = [] for cidr in cidr_input: net = ipaddress.ip_network(cidr, strict=False) result.append((net[0], net[-1])) return result # 测试单个CIDR print(get_ip_ranges("187.11.62.92/30")) # 测试CIDR列表 cidrs = ["187.11.62.92/30", "192.168.1.0/24"] print(get_ip_ranges(cidrs))
方式2:用列表推导式配合原函数(原函数保持处理单个CIDR)
import ipaddress def get_ip_range(cidr): net = ipaddress.ip_network(cidr, strict=False) return net[0], net[-1] cidrs = ["187.11.62.92/30", "192.168.1.0/24"] # 遍历列表每个元素,调用函数生成IP范围 ip_ranges = [get_ip_range(cidr) for cidr in cidrs] print(ip_ranges)
解决方案二:处理"起始IP,结束IP"格式的列表
如果你的输入是类似"187.11.62.93,187.11.62.95"的IP对字符串列表,可使用以下代码:
import ipaddress def get_range_from_ip_pair(ip_pair): # 拆分IP对字符串为起始和结束IP start_ip_str, end_ip_str = ip_pair.split(',') start_ip = ipaddress.ip_address(start_ip_str.strip()) end_ip = ipaddress.ip_address(end_ip_str.strip()) return start_ip, end_ip # 处理IP对列表 ip_pairs = ["187.11.62.93,187.11.62.95", "192.168.1.1,192.168.1.10"] ip_ranges = [get_range_from_ip_pair(pair) for pair in ip_pairs] print(ip_ranges)
内容的提问来源于stack exchange,提问作者Nuno
相关产品推荐
相关产品推荐

