2016-09-26 87 views
1

删除IP地址的重复我有一个数组:通过网络掩码

[192.0.0.3, 0.0.0.0 , 192.0.10.24, ...] 

随着IP地址,我想删除重复的/ 16网络掩码,所以我就192.0.0.3但192.0.10.24会删除(我不介意他们中的哪一个,如果第一个被删除也是可以的)。

我的第一个想法是使用正则表达式来投射网络掩码并删除与当时生成的patttern匹配的每个IP地址。

有没有更简单的方法?

回答

1

你可以使用一组删除重复,用钥匙作为前两个部分的元组:

>>> 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 
+0

谢谢,这个看起来方式比使用正则表达式更好。 我会尽快将其标记为正确。 – PhilipB

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'] 

如果您需要第一次发生而不是l AST一个,一个快速和肮脏的解决办法是扭转榜第一:

ipaddress
>>> 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小号提示:

>>> 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'] 
+0

使用''ipaddress''中的''ip_network''(如果可用的话当然更通用) – damienfrancois