因此,对于单一搜索:
from netaddr import IPAddress, IPNetwork
if IPAddress( address ) in IPNetwork( network ):
print( 'in' )
但是如果给你一个网络列表怎么办?是否可以不使用 for 循环来做到这一点?执行此任务的 pythonic 方法是什么? ...最好可读,然后更快。
from netaddr import IPAddress, IPNetwork
networks = [
'1.0.0.0\8',
'2.0.0.0\8',
# ...
'21.22.14.0\24' # something random
]
for network in networks:
if IPAddress( address ) in IPNetwork( network ):
print( 'in' )
break
编辑:对于任何感兴趣的人,我采用了给定的网络列表,并将每个网络扩展到其地址列表。然后我拿走了那个地址列表并从中制作了一组。鉴于集合具有 O(1) 查找,我认为它会有所帮助。
完成 for 循环(无设置)所需的时间为 24 分钟。
使用时间:
address_set = set()
for network in networks:
for address in IPNetwork( network ).subnet( 32 ):
non_CIDR_address = str( address ).split( '/' )[ 0 ]
address_set.add( non_CIDR_address )
if query_address in address_set:
print( 'in' )
if address in address_set:
print( 'in' )
...是 2 分 37 秒。
开始吧!
注意:扩展网络可能会占用大量内存。
最佳答案
if any(IPAddress(address) in IPNetwork(network) for network in networks):
...
可以通过仅实例化一次 IPAddress
并将 IPNetwork
存储在列表中来完成优化。
关于python - 如何检查 IP 地址是否在 python 网络列表中的任何网络中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30085594/