python - 将 IP 列表转换为相应 IP 范围的列表(python)
问题描述
我想将 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']
到
ipranges = ['137.226.161.0/24', '134.130.4.0/24', '8.8.8.0/24', '8.8.4.0/24', '134.130.5.0/24']
这样做最有效的方法是什么?我还没有找到提供类似功能的模块。使用此功能的原因是应将一长串 IP(超过 1000 个 ips)转换为子网列表以提高可读性。
谢谢
解决方案
如果我理解正确,您只想根据前 24 位 (/24) 相同的情况进行匹配。对于这些任务,我推荐一个set
:
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"
现在我们将这些前缀添加到set
. Pythonset
只允许唯一元素。这导致:ìpset == {'134.130.5', '8.8.4', '8.8.8', '134.130.4', '137.226.161'}
最后,我们遍历集合并附加后缀“.0/24”来表示子网。
编辑:关于“效率”
我喜欢darkless 的答案,但只知道我的解决方案要快得多(1.2 s vs 0.09 s):
>>> 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...
推荐阅读
- json - Visual Studio 中的未知 JSON 警告
- elasticsearch - ElasticSearch 按具有值或空值的地理位置过滤
- php - 检查Coupon是否存在以及是否是第一个订单
- ember.js - 如何替换 EmberJs 中链接组件上的 invokeAction 属性?
- python - 合并 PDF,同时保留自定义页码(又名页面标签)和书签
- r - 如何控制使用“mgcViz”包中的 plot.mgamViz 生成的 mqgam 绘图的外观(例如线条大小、线条类型、颜色)?
- php - 如何使用 curl 和 php 进行网站授权?
- c++ - 从 Yosys 导入组合逻辑有向图到 boost 库
- python-2.7 - Haddop Streaming 中的输入拆分
- angularjs - 来自 AngularJS 组件的表面信息