使用 Python ipaddress 模块崩溃 IP 网络

Ter*_*rry 3 subnet python-3.x

我在使用该方法时遇到困难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
Run Code Online (Sandbox Code Playgroud)

我只取回原始列表:

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')]
Run Code Online (Sandbox Code Playgroud)

ale*_*rst 5

假设您的输入是来自 ipaddress 的 IPv4Networks 列表,例如...

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')]
Run Code Online (Sandbox Code Playgroud)

你想要的输出是

[IPv4Network('192.168.0.0/21'), IPv4Network('192.168.8.0/24')]
Run Code Online (Sandbox Code Playgroud)

所有这一切都可以通过...来完成

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))
Run Code Online (Sandbox Code Playgroud)

collapse_addresses方法实际上获取整个地址列表,您不必一一向其提供 ip_addresses。它将返回崩溃网络的生成器,但您可以将其转换为列表以更轻松地处理它。

如果这不是您想要实现的目标,请告诉我。
确切地理解你的代码应该做什么有点困难,因为下面的代码片段启动了一个 for 循环,它获取第一个 ip 地址,将其折叠到一个生成器中,并返回带有该单个 ip 地址的生成器,而不查看任何其他IP地址。然而,这似乎与您的问题声称的输出不一致。

for net in n:
    snet = ipaddress.collapse_addresses(net)
    return snet
Run Code Online (Sandbox Code Playgroud)