我有一个数组:
[192.0.0.3, 0.0.0.0 , 192.0.10.24, ...]
使用IP地址并且我想删除/ 16网络掩码的重复项,所以我得到了192.0.0.3但是192.0.10.24将被删除(我不介意其中哪一个,它也没关系,如果第一个被删除)。
我的第一个想法是使用正则表达式来转换网络掩码并删除与当时生成的patttern匹配的每个IP地址。
有更简单的方法吗?
答案 0 :(得分:1)
您可以使用集合删除重复项,其中键是前两部分的元组:
final HTTPDestination destination = sessionService.executeInLocalView(
SessionExecutionBody.withResult(() -> {
userService.setCurrentUser(userService.getAdminUser());
final String destinationName =
getConfigurationService().getConfiguration().getString(DESTINATION_PROPERTY);
return getHttpDestinationService().getHTTPDestination(destinationName);
}));
或者使用ipaddress模块:
>>> 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
答案 1 :(得分:1)
你可以使用字典:
>>> 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']
@eugne的ipaddress
示例:
>>> 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']