如果网络地址是另一个网络的子网,如何从列表中删除网络地址

问题描述 投票:0回答:2

从 csv 文件创建 ipaddress/CIDR 列表,将 ipaddresses 转换为网络地址,然后通过从列表中创建一个集合(python 3.7)来消除重复项,我迭代并消除所有 subnets_of() 另一个子网的子网,保留汇总地址或超网地址。我使用 ipaddress 模块来完成这项工作。问题是,如果子网与其自身进行比较,它仍然算作子网。例如,

a = ipaddress.ip_network('192.168.0.0/24')
b = ipaddress.ip_network('192.168.0.0/24')
b.subnet_of(a)
True

所以即使我的列表中有 192.168.0.0/23,/24 仍然会被添加,因为所有地址都会与所有地址进行比较。有没有更好的办法来处理这种情况?

我尝试从我的工作列表中删除子网,这样它就不会再次迭代,但没有成功。

没有错误消息。我刚刚获得了一个适合列表中更大子网的子网。这留下了一个不必要的条目。

python-3.x subnet
2个回答
0
投票

您是否尝试过删除

/
之后的所有内容?


0
投票

*Network
对象比较是否相等,因此您可以像这样修改条件:

In [21]: import ipaddress

In [22]: a = ipaddress.ip_network('192.168.0.0/24')

In [23]: b = ipaddress.ip_network('192.168.0.0/24')

In [24]: a.subnet_of(b) and a != b
Out[24]: False

但这仍然会在你的列表中留下重复的内容。

netaddr
包有一个
cidr_merge
功能,可以实现我认为你想要的功能:

In [33]: from netaddr import cidr_merge

In [34]: cidr_merge(['192.168.5.0/24', '192.168.0.0/24', '192.168.0.0/28', '192.168.0.0/24'])
Out[34]: [IPNetwork('192.168.0.0/24'), IPNetwork('192.168.5.0/24')]
© www.soinside.com 2019 - 2024. All rights reserved.