2016-09-26 141 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