python-从较大范围中减去范围

python-从较大范围中减去范围,python,networking,range,subnet,Python,Networking,Range,Subnet,我遇到的问题是,我基本上希望找到BGP聚合地址(例如:10.76.32.0 255.255.240.0)和同一路由器上的所有网络命令(例如:10.76.32.0 255.255.255.0、10.76.33.0 255.255.0)之间是否存在任何空闲子网 在上面的示例中,10.76.34.0->10.76.47.255将是免费的 我正在考虑通过将IP地址和子网掩码转换为二进制并以这种方式进行减法来解决这个问题 为了简单起见,我将这个例子保留为十进制,但这样做会给我留下以下问题:假设我有一个从1

我遇到的问题是,我基本上希望找到BGP聚合地址(例如:
10.76.32.0 255.255.240.0
)和同一路由器上的所有网络命令(例如:
10.76.32.0 255.255.255.0、10.76.33.0 255.255.0
)之间是否存在任何空闲子网

在上面的示例中,
10.76.34.0
->
10.76.47.255
将是免费的

我正在考虑通过将IP地址和子网掩码转换为二进制并以这种方式进行减法来解决这个问题

为了简单起见,我将这个例子保留为十进制,但这样做会给我留下以下问题:假设我有一个从1到250的范围,我从中减去一个从20到23的较小范围,我希望得到一个从1到19,从24到250的范围

使用range命令并不能真正给出预期的结果,虽然我可以创建一个包含范围内每个项目的列表,并减去另一个包含项目子集的列表,但在我看来,拥有可能包含数万个元素的列表可能不是一个好主意


Hunor

如果您试图创建一个有间隙的“范围”,即1-9和24-250,那么您可以尝试使用(或者如果您使用的是Python 2.X),该模块将谓词和序列作为其参数,并返回谓词返回的序列元素
False
。例如,如果您这样做:

from itertools import filterfalse
new_range = filterfalse(lambda x: 20 <= x <= 23, range(1,251))

如果您试图创建一个带有间隙的“范围”,即1-9和24-250,那么您可以尝试使用(或者如果您使用的是Python 2.X),该模块将谓词和序列作为其参数,并返回谓词返回的序列元素
False
。例如,如果您这样做:

from itertools import filterfalse
new_range = filterfalse(lambda x: 20 <= x <= 23, range(1,251))

这个问题很久以前就有人问过了,但我想添加
numpyarray
答案

import numpy as np
aa=np.arange(1,251)
bb=np.concatenate((np.array(aa[aa<20]),np.array(aa[aa>23])))
print(bb)

这个问题很久以前就有人问过了,但我想添加
numpyarray
答案

import numpy as np
aa=np.arange(1,251)
bb=np.concatenate((np.array(aa[aa<20]),np.array(aa[aa>23])))
print(bb)

您是否尝试过ipaddress-IPv4/IPv6操纵库?它有许多有趣的特性。我同意Pancho的观点,我会使用ip地址库,因为我不认为您的范围逻辑非常健壮。另外,您如何获得
10.76.34.0->10.79.47.255
10.76.32.0/20
中的最后一个地址是
10.76.47.254
@Panch-Jay我找到了,我只是想说我没有找到任何方法来帮助解决我的问题,但我去了另一个时间检查,以确保。。。我找到了“地址排除(网络)”,这正是我想要实现的。谢谢你的回答。不幸的是,我不认为我能将两个答案标记为正确,并首先回答elethan:(@PadraicCunningham woops,typo(79而不是76)你试过ipaddress-IPv4/IPv6操纵库吗?它有很多有趣的功能。我同意Pancho的观点,我会使用ip地址库,因为我不认为你的范围逻辑非常健壮。还有,你是如何得到
10.76.34.0->10.79.47.255
?在
10.76.32.0/20
中的最后一个地址是
10.76.47.254
@Panc我找到了,我只是想说我没有找到任何it方法来帮助解决我的问题,但又去检查了一次,只是为了确保……我找到了“地址排除(网络)”“这正是我想要完成的。谢谢你的回答。不幸的是,我认为我无法将两个答案标记为正确,并首先回答elethan:(@PadraicCunningham woops,typo(79而不是76)这似乎正是我想要的。我用它做了一些测试:-你可以重复使用iterable对象,以完全相同的方式从中减去另一个范围。-如果减去不属于对象的元素,它不会抛出任何错误,它只减去边界内的元素,而忽略其余部分。谢谢:DGlad听到了!iter工具有很多非常有用的函数,有时甚至是意想不到的函数。如果你有迭代器的问题要解决,它通常是值得检查的。这似乎正是我想要的。我用它做了一些测试:-你可以重复使用iterable对象,以完全相同的方式从中减去另一个范围。-它不会抛出任何错误如果减去不属于对象的元素,它只减去边界内的元素,而忽略其余的元素。谢谢:DGlad!itertools有很多非常有用的函数,有时甚至是意外的函数。如果您有问题要用迭代器解决,通常值得一试。