Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 查找IP地址和IP网络集合中的IP_Python_Ip - Fatal编程技术网

Python 查找IP地址和IP网络集合中的IP

Python 查找IP地址和IP网络集合中的IP,python,ip,Python,Ip,我有一个包含ip4地址和ip4网络的集合 简单的简短示例: {'127.0.0.1', '138.56.76.02', '192.4.2.0/24', '29.24.48.80', etc, etc, etc} 真正的尺寸是几千件 问题是——检查特定ip地址'xxx.yyy.zzz.lll'是否包含在所有这些ip地址和ip网络的混合中而不逐个迭代的最快方法是什么 对于普通ip设置,这是显而易见的,但对于ip网络的存在,情况并非如此,因为网络可能也包含此ip 也可以使用相同的集合,但IP和网络

我有一个包含ip4地址和ip4网络的集合

简单的简短示例:

{'127.0.0.1', '138.56.76.02', '192.4.2.0/24', '29.24.48.80', etc, etc, etc}

真正的尺寸是几千件

问题是——检查特定ip地址
'xxx.yyy.zzz.lll'
是否包含在所有这些ip地址和ip网络的混合中而不逐个迭代的最快方法是什么

对于普通ip设置,这是显而易见的,但对于ip网络的存在,情况并非如此,因为网络可能也包含此ip

也可以使用相同的集合,但IP和网络内部包装在
IPv4Address
IPv4Network
包中的
IPv4Network
对象中

也许有可能以某种方式将所有这些结合到一个伪网络中


谢谢…

我建议使用列表并执行以下操作:

if "xxx.yyy.zzz.ttt" in ip_list:
    print("IP IN LIST")

关于。

我建议使用列表并执行以下操作:

if "xxx.yyy.zzz.ttt" in ip_list:
    print("IP IN LIST")

关于。

一种方法是使用
ipaddress
模块构建
IPv4Address
实例的

>>> from ipaddress import *
>>> from itertools import *
>>>
>>> p = {'127.0.0.1', '138.56.76.02', '192.4.2.0/24', '29.24.48.80', ...}
>>>
>>> all_hosts = set(chain.from_iterable(IPv4Network(n) for n in p))
>>>
>>> IPv4Address('192.4.2.4') in all_hosts
True
>>> IPv4Address('29.24.48.80') in all_hosts
True
>>> IPv4Address('29.24.48.81') in all_hosts
False
这利用了这样一个事实,即仅从一个地址(不带掩码)构建IPV4网络将创建一个仅包含该地址的网络。它还使用了迭代
ipv4网络
依次为每个主机提供的功能

如果p较大或网络掩码包含许多主机,则所有\u主机的
集构建速度较慢,内存较大。然而,在此之后,检查IP地址是否在集合中是快速的(平均为O(1))


如果
p
已经包含
IPv4Network
IPv4Address
实例,那么所有这些仍然有效。

一种方法是使用
ipaddress
模块构建
IPv4Address
实例的
集合:

>>> from ipaddress import *
>>> from itertools import *
>>>
>>> p = {'127.0.0.1', '138.56.76.02', '192.4.2.0/24', '29.24.48.80', ...}
>>>
>>> all_hosts = set(chain.from_iterable(IPv4Network(n) for n in p))
>>>
>>> IPv4Address('192.4.2.4') in all_hosts
True
>>> IPv4Address('29.24.48.80') in all_hosts
True
>>> IPv4Address('29.24.48.81') in all_hosts
False
这利用了这样一个事实,即仅从一个地址(不带掩码)构建IPV4网络将创建一个仅包含该地址的网络。它还使用了迭代
ipv4网络
依次为每个主机提供的功能

如果p较大或网络掩码包含许多主机,则所有\u主机的
集构建速度较慢,内存较大。然而,在此之后,检查IP地址是否在集合中是快速的(平均为O(1))


如果
p
已经包含
IPv4Network
IPv4Address
实例,所有这些仍然有效。

您可以创建一组单个IP,并检查您的IP是否是O(1)中的一个。对于子网部分,您可以看看您可以创建一组单个IP,并检查您的IP是否是O(1)中的其中一个IP。对于子网部分,您可以看一看谢谢您的回答。我想到了类似的事情。但您不认为在为集合中的每个对象创建IPv4Network之后创建IPv4Address实例会很慢吗?Mybe最好从集合中筛选出网络(多多少少10%到90%),然后将网络扩展到单个IP列表,而不将它们转换为IPv4Network和IPv4Address?唯一确定的方法是测量。您可以使用或仅使用秒表来查看构建
所有\u主机
的方式更快,然后考虑在程序中重建
所有\u集
的频率,并确定差异是否足够大,是否值得额外的复杂性。谢谢您的回答。我想到了类似的事情。但您不认为在为集合中的每个对象创建IPv4Network之后创建IPv4Address实例会很慢吗?Mybe最好从集合中筛选出网络(多多少少10%到90%),然后将网络扩展到单个IP列表,而不将它们转换为IPv4Network和IPv4Address?唯一确定的方法是测量。您可以使用或仅使用秒表查看构建
所有\u主机
的方式是否更快,然后考虑在程序中重建
所有\u集
的频率,并确定差异是否足够大,是否值得付出额外的复杂性。