python - 如何检查 IP 地址是否在 python 网络列表中的任何网络中?

标签 python algorithm

因此,对于单一搜索:

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/

相关文章:

python - 为什么 gunicorn 使用相同的线程

python - 杀死python进程时杀死子进程?

python - flask super 教程配置问题

python - 在 Scrapy 中发送帖子请求

mysql - 根据字段的总和从表中选择随机行的快速方法

algorithm - 在哪里可以了解有关 Google 搜索 "did you mean"算法的更多信息?

python - 使用opencv python在游戏板上进行矩形检测

java - 为什么我的 Dijkstra 代码会失败?

algorithm - 使用位操作判断一个无符号整数是否可以用 2^n-1 的形式表示

algorithm - 证明 NP-Completeness clique + 独立集图