将IP列表转换为相应IP范围的列表(python)

将IP列表转换为相应IP范围的列表(python),python,ip,subnet,Python,Ip,Subnet,我想将IP列表转换为相应IP范围的列表。 例如: iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.22

我想将IP列表转换为相应IP范围的列表。 例如:

iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.226.161.234', '137.226.161.236', '134.130.5.1']

最有效的方法是什么?我还没有找到一个模块提供这样的功能。此功能的原因是,应将一长串IP(超过1000个IP)转换为子网列表,以提高可读性


谢谢

如果我理解正确,您只希望根据前24位(/24)相同进行匹配。对于这些任务,我建议设置

iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.226.161.234', '137.226.161.236', '134.130.5.1']

ipset = set()
for i in iplist:
    ipset.add(".".join(i.split(".")[:-1]))

ipranges = [p + ".0/24" for p in ipset]
print(ipranges)
这张照片是:
['134.130.5.0/24','8.8.4.0/24','8.8.8.0/24','134.130.4.0/24','137.226.161.0/24']

那么这段代码是做什么的呢? 首先,我们遍历该列表并切断每个IP的最后一段:

segments = "8.8.8.8".split(".")  # segments == ["8", "8", "8", "8"]
segments_cut = segments[:-1]     # segments_cut == ["8", "8", "8"]
prefix = ".".join(segments_cut)  # prefix == "8.8.8"
现在我们将这些前缀添加到
集合
。Python
set
只允许唯一的元素。这导致:
ìpset=={'134.130.5','8.8.4','8.8.8','134.130.4','137.226.161'}

最后,我们遍历集合并附加后缀“.0/24”以表示子网

编辑:关于“效率” 我喜欢,但只知道我的解决方案要快得多(1.2秒vs 0.09秒):


正如Hampus Larsson提到的,您可以使用python ipaddress模块:

import ipaddress

iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.226.161.234', '137.226.161.236', '134.130.5.1']

ipranges = [str(ipaddress.ip_network('{}/24'.format(ip), strict=False)) for ip in iplist]

>>> ipranges
['137.226.161.0/24', '134.130.4.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '8.8.8.0/24', '8.8.4.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '134.130.5.0/24']


是所有的IP作用域都是/24,还是也有子网掩码?不管怎样,我会查看模块。这就是我要找的!谢谢,听到这个消息我很高兴!关于效率的好发现;)对于/24范围(或/8/16/32),您的解决方案确实更好。
>>> import timeit
>>> # darkless' ipaddress solution
>>> timeit.timeit("[str(ipaddress.ip_network('{}/24'.format(ip), strict=False)) for ip in iplist]", setup="import ipaddress;iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.226.161.234', '137.226.161.236', '134.130.5.1']", number=10000)
1.186...
>>> # My solution
>>> timeit.timeit("[p + '.0/24' for p in {'.'.join(i.split('.')[:-1]) for i in iplist}]", setup="import ipaddress;iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.226.161.234', '137.226.161.236', '134.130.5.1']", number=10000)
0.096...
import ipaddress

iplist = ['137.226.161.121', '134.130.4.1', '137.226.161.149', '137.226.161.221', '137.226.161.240', '137.226.161.237', '8.8.8.8', '8.8.4.4', '137.226.161.189', '137.226.161.245', '137.226.161.172', '137.226.161.241', '137.226.161.234', '137.226.161.236', '134.130.5.1']

ipranges = [str(ipaddress.ip_network('{}/24'.format(ip), strict=False)) for ip in iplist]

>>> ipranges
['137.226.161.0/24', '134.130.4.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '8.8.8.0/24', '8.8.4.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '137.226.161.0/24', '134.130.5.0/24']