Select 每个子网范围的第一个和最后一个 IP 地址
Select every first and last IP Address of subnet ranges
我有一个子网 172.16.0.0/22
,其中有四个范围 172.16.0.0 → 172.16.0.255
、172.16.1.0 → 172.16.1.255
、172.16.2.0 → 172.16.2.255
和 172.16.3.0 → 172.16.3.255
。我正在使用 netaddr
来查找这些范围。
import netaddr
network = netaddr.IPNetwork(addr="172.16.0.0/22")
print(list(network))
# output
[
IPAddress("172.16.0.0"),
IPAddress("172.16.0.1"),
...,
IPAddress("172.16.0.254"),
IPAddress("172.16.0.255"),
...,
IPAddress("172.16.1.0"),
IPAddress("172.16.1.1"),
...,
IPAddress("172.16.1.254"),
IPAddress("172.16.1.255"),
...,
IPAddress("172.16.2.0"),
IPAddress("172.16.2.1"),
...,
IPAddress("172.16.2.254"),
IPAddress("172.16.2.255"),
...,
IPAddress("172.16.3.0"),
IPAddress("172.16.3.1"),
...,
IPAddress("172.16.3.254"),
IPAddress("172.16.3.255"),
]
如何选择每个范围的每个.1
和.254
?即,如何获得如下所示的输出
[
(172.16.0.1, 172.16.0.254),
(172.16.1.1, 172.16.1.254),
(172.16.2.1, 172.16.2.254),
(172.16.3.1, 172.16.3.254)
]
试试这个:
result = [(str(network[256 * r + 1]), str(network[256 * r + 254]))
for r in range(len(network) // 256)]
基本上,对于每个范围(有 len(network) // 256
个范围),您都取元素 n。 1 (network[256 * r + 1]
) 和 n。 254(network[256 * r + 254]
)。这些元素是 class <class 'netaddr.ip.IPAddress'>
的实例:为了将它们转换为字符串,您可以使用 str
内置函数。
检查每个 IP 地址中的最后一个八进制数,看它们是否是所需的数字之一。我更喜欢这个解决方案,因为它只使用 netaddr
对象结构。
[n for n in network if n.words[-1] in [1, 254]]
我还没有用 netaddr 对象尝试过,但代码也应该 运行 因为我将地址隐藏为字符串。不过,这并不完全是您想要的。每个范围的地址都保存在列表中。
network = [
"172.16.0.0","172.16.0.1","172.16.0.254","172.16.0.255","172.16.1.0",
"172.16.1.1","172.16.1.254","172.16.1.255","172.16.2.0","172.16.2.1",
"172.16.2.254","172.16.2.255","172.16.3.0",
"172.16.3.1","172.16.3.254","172.16.3.255",
]
def get_adress(network):
output,tmp = [],[]
for ad in network:
ad_str = str(ad)
if ad_str.endswith('.1') or ad_str.endswith('.254'):
tmp.append(ad_str)
if len(tmp)==2:
output.append(tmp)
tmp= []
return(output)
output= get_adress(network)
print(output)
>>[['172.16.0.1', '172.16.0.254'],
['172.16.1.1', '172.16.1.254'],
['172.16.2.1', '172.16.2.254'],
['172.16.3.1', '172.16.3.254']]
编辑
这现在将地址作为列表中的元组。
def get_adress(network):
one,two = [],[]
for ad in network:
ad_str = str(ad)
if ad_str.endswith('.1'):
one.append(ad_str)
elif ad_str.endswith('.254'):
two.append(ad_str)
return(list(zip(one, two)))
output= get_adress(network)
output
>>[('172.16.0.1', '172.16.0.254'),
('172.16.1.1', '172.16.1.254'),
('172.16.2.1', '172.16.2.254'),
('172.16.3.1', '172.16.3.254')]
我有一个子网 172.16.0.0/22
,其中有四个范围 172.16.0.0 → 172.16.0.255
、172.16.1.0 → 172.16.1.255
、172.16.2.0 → 172.16.2.255
和 172.16.3.0 → 172.16.3.255
。我正在使用 netaddr
来查找这些范围。
import netaddr
network = netaddr.IPNetwork(addr="172.16.0.0/22")
print(list(network))
# output
[
IPAddress("172.16.0.0"),
IPAddress("172.16.0.1"),
...,
IPAddress("172.16.0.254"),
IPAddress("172.16.0.255"),
...,
IPAddress("172.16.1.0"),
IPAddress("172.16.1.1"),
...,
IPAddress("172.16.1.254"),
IPAddress("172.16.1.255"),
...,
IPAddress("172.16.2.0"),
IPAddress("172.16.2.1"),
...,
IPAddress("172.16.2.254"),
IPAddress("172.16.2.255"),
...,
IPAddress("172.16.3.0"),
IPAddress("172.16.3.1"),
...,
IPAddress("172.16.3.254"),
IPAddress("172.16.3.255"),
]
如何选择每个范围的每个.1
和.254
?即,如何获得如下所示的输出
[
(172.16.0.1, 172.16.0.254),
(172.16.1.1, 172.16.1.254),
(172.16.2.1, 172.16.2.254),
(172.16.3.1, 172.16.3.254)
]
试试这个:
result = [(str(network[256 * r + 1]), str(network[256 * r + 254]))
for r in range(len(network) // 256)]
基本上,对于每个范围(有 len(network) // 256
个范围),您都取元素 n。 1 (network[256 * r + 1]
) 和 n。 254(network[256 * r + 254]
)。这些元素是 class <class 'netaddr.ip.IPAddress'>
的实例:为了将它们转换为字符串,您可以使用 str
内置函数。
检查每个 IP 地址中的最后一个八进制数,看它们是否是所需的数字之一。我更喜欢这个解决方案,因为它只使用 netaddr
对象结构。
[n for n in network if n.words[-1] in [1, 254]]
我还没有用 netaddr 对象尝试过,但代码也应该 运行 因为我将地址隐藏为字符串。不过,这并不完全是您想要的。每个范围的地址都保存在列表中。
network = [
"172.16.0.0","172.16.0.1","172.16.0.254","172.16.0.255","172.16.1.0",
"172.16.1.1","172.16.1.254","172.16.1.255","172.16.2.0","172.16.2.1",
"172.16.2.254","172.16.2.255","172.16.3.0",
"172.16.3.1","172.16.3.254","172.16.3.255",
]
def get_adress(network):
output,tmp = [],[]
for ad in network:
ad_str = str(ad)
if ad_str.endswith('.1') or ad_str.endswith('.254'):
tmp.append(ad_str)
if len(tmp)==2:
output.append(tmp)
tmp= []
return(output)
output= get_adress(network)
print(output)
>>[['172.16.0.1', '172.16.0.254'],
['172.16.1.1', '172.16.1.254'],
['172.16.2.1', '172.16.2.254'],
['172.16.3.1', '172.16.3.254']]
编辑
这现在将地址作为列表中的元组。
def get_adress(network):
one,two = [],[]
for ad in network:
ad_str = str(ad)
if ad_str.endswith('.1'):
one.append(ad_str)
elif ad_str.endswith('.254'):
two.append(ad_str)
return(list(zip(one, two)))
output= get_adress(network)
output
>>[('172.16.0.1', '172.16.0.254'),
('172.16.1.1', '172.16.1.254'),
('172.16.2.1', '172.16.2.254'),
('172.16.3.1', '172.16.3.254')]