繁体   English   中英

通过网络掩码删除IP地址的重复项

[英]Remove duplicates of IP addresses by netmask

我有一个数组:

[192.0.0.3, 0.0.0.0 , 192.0.10.24, ...]

使用IP地址并且我想删除/ 16网络掩码的重复项,因此我得到了192.0.0.3,但是192.0.10.24将被删除(我不介意其中一个,如果删除了第一个,也可以)。

我的第一个想法是使用正则表达式强制转换网络掩码并删除与随后生成的模式匹配的每个IP地址。

有更容易的方法吗?

您可以使用一组来删除重复项,其中的键是前两个部分的元组:

>>> ips = ["192.0.0.3", "0.0.0.0", "192.0.10.24"]
>>> seen = set()
>>> for ip in ips:
...     key = tuple(ip.split(".")[:2])
...     if key not in seen:
...         print(ip)
...         seen.add(key)
... 
192.0.0.3
0.0.0.0

或使用ipaddress模块:

>>> from ipaddress import ip_network
>>> ips = ["192.0.0.3", "0.0.0.0", "192.0.10.24"]
>>> seen = set()
>>> for ip in ips:
...     key = ip_network(ip + "/16", strict=False)
...     if key not in seen:
...         print(ip)
...         seen.add(key)
... 
192.0.0.3
0.0.0.0

您可以使用字典:

>>> res = {}
>>> for ip in ["192.0.0.3", "0.0.0.0", "192.0.10.24"]:
...    res[tuple(ip.split('.',2)[0:2])]=ip
>>> res.values()
['0.0.0.0', '192.0.10.24']

如果您需要第一次出现而不是最后一次出现,那么一种快速而肮脏的解决方案是首先将列表反转:

>>> res = {}
>>> for ip in reversed(["192.0.0.3", "0.0.0.0", "192.0.10.24"]):
...    res[tuple(ip.split('.',2)[0:2])]=ip
>>> res.values()
['0.0.0.0', '192.0.0.3']

ipaddress为@eugne的示例表明:

>>> import ipaddress
>>> res = {}
>>> for ip in [u"192.0.0.3", u"0.0.0.0", u"192.0.10.24"]:
...    res[ipaddress.ip_network(ip + "/16", strict=False)]=ip
>>> res.values()
[u'192.0.10.24', u'0.0.0.0']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM