使用Python ipaddress模块折叠IP网络

toe95027  于 2022-12-01  发布在  Python
关注(0)|答案(1)|浏览(157)

我在使用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')]
vsdwdz23

vsdwdz231#

假设您输入的是来自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,它会为崩溃的网络返回一个生成器,但是你可以把它转换成一个列表来处理它。
如果这不是你想要的结果,请告诉我。
下面的代码片段启动了一个for循环,它获取第一个ip地址,并将其折叠成一个生成器,然后返回带有该ip地址的生成器,而不查看任何其他ip地址,因此很难理解你的代码应该做什么。然而,这似乎与你的问题所声称的输出不一致。

for net in n:
    snet = ipaddress.collapse_addresses(net)
    return snet

相关问题