【问题标题】:dynamic range in slice or array切片或数组中的动态范围
【发布时间】:2018-01-23 12:11:09
【问题描述】:

我有从 netaddr 生成 IP 子网信息的 python 脚本。

from netaddr import *
ipnetwork = raw_input("Enter IP address: ")
ip = IPNetwork(ipnetwork)
print "Network ID:", ip.network
print "Network Broadcast:", ip.broadcast
print "Subnet Mask:", ip.netmask
print "Prefix Length:", ip.prefixlen
print "Wildcard Mask:", ip.hostmask
print "Network Size:", ip.size

print "Host range is:", ip[1], "-", ip[-2]
for ip in IPNetwork(ipnetwork).iter_hosts():
    print '%s' % ip

这行得通。我遇到麻烦的地方是我想“保留”第一个和最后三个地址。这是我当前输出的示例:

Enter IP address: 192.168.100.17/28
Network ID: 192.168.100.16
Network Broadcast: 192.168.100.31
Subnet Mask: 255.255.255.240
Prefix Length: 28
Wildcard Mask: 0.0.0.15
Network Size: 16
Host range is: 192.168.100.17 - 192.168.100.30
192.168.100.17
192.168.100.18
192.168.100.19
192.168.100.20
192.168.100.21
192.168.100.22
192.168.100.23
192.168.100.24
192.168.100.25
192.168.100.26
192.168.100.27
192.168.100.28
192.168.100.29
192.168.100.30

我想要的结果是

192.168.100.17 Reserved
192.168.100.18 Reserved
192.168.100.19 Reserved
192.168.100.20
192.168.100.21
192.168.100.22
192.168.100.23
192.168.100.24
192.168.100.25
192.168.100.26
192.168.100.27
192.168.100.28 SW2-VLAN 100
192.168.100.29 SW1-VLAN 100
192.168.100.30 HSRP VLAN 100

我认为切片会起作用并且确实有效,直到我选择不同的子网长度。我不知道如何动态地将地址四(第一个非保留)切片到最后一个地址减去三。我找不到任何解决方案(切片、数组、索引),它会根据子网大小减去第一个和最后三个地址是动态的。任何指针将不胜感激。

【问题讨论】:

    标签: arrays python-2.7 slice


    【解决方案1】:

    我对这个问题有点困惑。如果您想管理IPNetwork(ipnetwork).iter_hosts(),您可能只想简单地列出并理解它们。

    def handle(i, data):
        # Each ip, or 'data', can be returned as a
        # new value to fill that list or we could return
        # The objects themselves.
        if i < 3:
            return str(data) + " Reverse"
        elif i > (total - 3):
            return str(data)
        else:
            return str(data) + " SW1-VLAN 100"
    
    ips_to_manage = [handle(i, addr) for i, addr in \
                     enumerate(IPNetwork(ipnetwork).iter_hosts())]
    for ip in ips_to_manage:
        print '%s' % ip
    

    您必须自己找出总数。 len(IPNetwork(ipnetwork).iter_hosts()) 应该做的伎俩。 这样,您就可以随心所欲地处理它们了。

    这只是打印它们,但是,如果您想做其他事情,例如作为对象本身的回报,那么欢迎您。

    【讨论】:

    • 感谢您的回复。我尝试了您的代码,但在 elif 处出现语法错误,看起来在理解列表中不受支持。是否有另一种方法来进行迭代并将其放入字符串/数组/字典中?
    • 在这个例子中 elif 应该没问题。我假设您用代码替换了每一行上的# ... 以实际处理数据?您遇到什么语法错误?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-14
    • 2016-08-03
    • 2015-12-07
    • 2019-05-16
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多