在 Python 的子网列表中的子网中找到所有不同的最大子网,它们是超网

find all the different biggest subnets that are supernet among subnets in a list of subnets in Python

我有一个子网列表,我需要从子网列表中找到所有最大的子网,这些子网是列表中存在的子网中的超网。

例子

subnetList = ['10.10.0.0/16', '10.10.10.10/32', '192.168.56.0/24', '10.0.0.0/8']

所以这里的输出['10.0.0.0/8', '192.168.56.0/24'] 是列表中不同子网中的两个顶级超网

为了解决这个问题,我目前正在使用使用 ipaddress python lib,

的实现

有没有更好的实现方式!!!! 因为这个问题似乎是在列表中找到多个不同类型的最大值

import ipaddress

inputS = ['172.16.0.0/16' ,'10.10.0.0/16', '10.10.10.10/32', '172.16.1.0/24', '10.10.10.0/24', '172.16.10.10/32', '192.168.56.0/24', '10.0.0.0/8']
inputS = list(set(inputS))
input = []

for each in inputS:
    input.append(ipaddress.ip_network(str(each)))

input1 = input

for i in range(len(input)):
    for j in range(len(input1)):
        if str(input[i]) != str(input1[j]):
            if input[i].supernet_of(input1[j]):
                input1[j] = input[i]

output = []

for each in input1:
    output.append(str(each))

print(list(set(output)))

python 中的 ipaddress 库有一个函数 collapse_addresses。 collapse_addresses 函数应该能够从输入的 ip 地址列表中直接输出超网。

请检查以下代码片段:

>>> import ipaddress
>>> inputS = ['172.16.0.0/16' ,'10.10.0.0/16', '10.10.10.10/32', '172.16.1.0/24', '10.10.10.0/24', '172.16.10.10/32', '192.168.56.0/24', '10.0.0.0/8']
>>> input_ips = [ipaddress.ip_network(x) for x in inputS]
>>> res = ipaddress.collapse_addresses(input_ips)
>>> print([x for x in res])
[IPv4Network('10.0.0.0/8'), IPv4Network('172.16.0.0/16'), IPv4Network('192.168.56.0/24')]