使用 Python ipaddress 模块折叠 IP 网络
Collapsing IP networks with Python ipaddress module
我在使用 ipaddress.collapse_addresses()
方法时遇到困难。
# n is a list of 192.168.0.0/24 networks (1,2,3,4....etc)
def sumnet():
n = nlist()
for net in n:
snet = ipaddress.collapse_addresses(net)
return snet
我只取回原始列表:
Collapsed Networks
[IPv4Network('192.168.0.0/24'), IPv4Network('192.168.1.0/24'),
IPv4Network('192.168.2.0/24'), IPv4Network('192.168.3.0/24'),
IPv4Network('192.168.4.0/24'), IPv4Network('192.168.5.0/24'),
IPv4Network('192.168.6.0/24'), IPv4Network('192.168.7.0/24'),
IPv4Network('192.168.8.0/24')]
假设您的输入是来自 ipaddress 的 IPv4 网络列表,例如...
netlist = [ipaddress.IPv4Network('192.168.0.0/24'),
ipaddress.IPv4Network('192.168.1.0/24'),
ipaddress.IPv4Network('192.168.2.0/24'),
ipaddress.IPv4Network('192.168.3.0/24'),
ipaddress.IPv4Network('192.168.4.0/24'),
ipaddress.IPv4Network('192.168.5.0/24'),
ipaddress.IPv4Network('192.168.6.0/24'),
ipaddress.IPv4Network('192.168.7.0/24'),
ipaddress.IPv4Network('192.168.8.0/24')]
你想要的输出是
[IPv4Network('192.168.0.0/21'), IPv4Network('192.168.8.0/24')]
所有这些都可以用...
import ipaddress
def sumnet(netlist):
return list(ipaddress.collapse_addresses(netlist))
netlist = [ipaddress.IPv4Network('192.168.0.0/24'),
ipaddress.IPv4Network('192.168.1.0/24'),
ipaddress.IPv4Network('192.168.2.0/24'),
ipaddress.IPv4Network('192.168.3.0/24'),
ipaddress.IPv4Network('192.168.4.0/24'),
ipaddress.IPv4Network('192.168.5.0/24'),
ipaddress.IPv4Network('192.168.6.0/24'),
ipaddress.IPv4Network('192.168.7.0/24'),
ipaddress.IPv4Network('192.168.8.0/24')]
print(sumnet(netlist))
collapse_addresses
方法实际上需要一个完整的地址列表,您不必一个一个地输入它 ip_addresses。它将 return 崩溃网络的生成器,但您可以将其转换为列表以更轻松地处理它。
如果这不是您想要完成的,请告诉我。
很难确切地理解您的代码应该做什么,因为以下代码片段启动了一个 for 循环,它在其中获取第一个 ip 地址并将其折叠到一个生成器中,然后 returns 该生成器具有该单个 ip 地址,无需查看任何其他 IP 地址。然而,这似乎与您的问题声称的输出不一致。
for net in n:
snet = ipaddress.collapse_addresses(net)
return snet
我在使用 ipaddress.collapse_addresses()
方法时遇到困难。
# n is a list of 192.168.0.0/24 networks (1,2,3,4....etc)
def sumnet():
n = nlist()
for net in n:
snet = ipaddress.collapse_addresses(net)
return snet
我只取回原始列表:
Collapsed Networks
[IPv4Network('192.168.0.0/24'), IPv4Network('192.168.1.0/24'),
IPv4Network('192.168.2.0/24'), IPv4Network('192.168.3.0/24'),
IPv4Network('192.168.4.0/24'), IPv4Network('192.168.5.0/24'),
IPv4Network('192.168.6.0/24'), IPv4Network('192.168.7.0/24'),
IPv4Network('192.168.8.0/24')]
假设您的输入是来自 ipaddress 的 IPv4 网络列表,例如...
netlist = [ipaddress.IPv4Network('192.168.0.0/24'),
ipaddress.IPv4Network('192.168.1.0/24'),
ipaddress.IPv4Network('192.168.2.0/24'),
ipaddress.IPv4Network('192.168.3.0/24'),
ipaddress.IPv4Network('192.168.4.0/24'),
ipaddress.IPv4Network('192.168.5.0/24'),
ipaddress.IPv4Network('192.168.6.0/24'),
ipaddress.IPv4Network('192.168.7.0/24'),
ipaddress.IPv4Network('192.168.8.0/24')]
你想要的输出是
[IPv4Network('192.168.0.0/21'), IPv4Network('192.168.8.0/24')]
所有这些都可以用...
import ipaddress
def sumnet(netlist):
return list(ipaddress.collapse_addresses(netlist))
netlist = [ipaddress.IPv4Network('192.168.0.0/24'),
ipaddress.IPv4Network('192.168.1.0/24'),
ipaddress.IPv4Network('192.168.2.0/24'),
ipaddress.IPv4Network('192.168.3.0/24'),
ipaddress.IPv4Network('192.168.4.0/24'),
ipaddress.IPv4Network('192.168.5.0/24'),
ipaddress.IPv4Network('192.168.6.0/24'),
ipaddress.IPv4Network('192.168.7.0/24'),
ipaddress.IPv4Network('192.168.8.0/24')]
print(sumnet(netlist))
collapse_addresses
方法实际上需要一个完整的地址列表,您不必一个一个地输入它 ip_addresses。它将 return 崩溃网络的生成器,但您可以将其转换为列表以更轻松地处理它。
如果这不是您想要完成的,请告诉我。
很难确切地理解您的代码应该做什么,因为以下代码片段启动了一个 for 循环,它在其中获取第一个 ip 地址并将其折叠到一个生成器中,然后 returns 该生成器具有该单个 ip 地址,无需查看任何其他 IP 地址。然而,这似乎与您的问题声称的输出不一致。
for net in n:
snet = ipaddress.collapse_addresses(net)
return snet