【问题标题】:understanding for loops and multidimensional arrays理解循环和多维数组
【发布时间】:2017-09-12 13:15:03
【问题描述】:

作为一个爱好项目,我正在尝试在互联网上创建一个公共可用路由侦听器网格,为此,我登录到所有这些侦听器并询问他们认识谁以及谁与他们直接连接。效果很好,现在我正在尝试将它们配对。

数学很简单,如果 IP 地址中的最后一个八位字节是偶数,则它的伙伴必须是下一个奇数,反之亦然(有些例外,但我手动执行)

现在如果你在这里运行脚本,你不会得到任何结果,我这样做是为了说明一个我不确定我如何反向解决问题的问题。

运行它,我不会得到任何错误,但如果我在列表中添加另一个元素

['ROUTER5124-A', '100.127.126.16', 'te0/0/24']

我收到此错误:

Traceback (most recent call last):
  File "zac.py", line 38, in <module>
    linknetsloop.remove(sublist)
ValueError: list.remove(x): x not in list

如果我打印出 linknetsloop.remove(sublist) 和 linknetsloop.remove(items) 它想要删除我添加的额外元素,实际上是两次。这很奇怪,因为它的合作伙伴 .17 甚至都不在那里。我认为错误是我循环遍历列表错误,但搜索几个小时后我找不到我的错误。

#!/usr/bin/python3.5

import re
import ipaddress

linknets = [
['ROUTER1190-A', '100.127.126.81', 'te0/0/2'] ,
['ROUTER1190-A', '100.127.126.83', 'te0/0/3'] ,
['ROUTER1323-A', '100.127.126.125', 'te0/0/24'] ,
['ROUTER1323-A', '100.127.126.97', 'te0/0/25'] ,
['ROUTER1242-B', '100.127.126.173', 'te0/0/25'] ,
['ROUTER1190-B', '100.127.126.55', 'te0/0/24'] ,
['ROUTER1190-B', '100.127.126.57', 'te0/0/25'] ,
['ROUTER1190-C', '100.127.126.171', 'te0/0/24'] ,
['ROUTER1190-C', '100.127.126.59', 'te0/0/25'] ,
['ROUTER5345-A', '100.127.126.25', 'te1/0/12'] ,
['ROUTER5345-A', '100.127.126.47', 'te2/0/12'] ,
['ROUTER1610-A', '100.127.126.69', 'te0/0/24'] ,
['ROUTERP-1242', '100.127.126.85', 'eth1/1/3'] ,
['ROUTERP-1242', '100.127.126.63', 'eth1/1/4'] ,
['ROUTERP-1242', '100.127.126.104', 'eth1/2/1'] ,
]

linknetsloop = linknets
linknets_complete = []

for sublist in linknets:
    search = 0
    lastoctet = re.match('.*?([0-9]+)$', sublist[1]).group(1)
    if int(lastoctet)%2==0: #Last octet is even
        search = ipaddress.IPv4Address(sublist[1]) + 1
    else:
        search = ipaddress.IPv4Address(sublist[1]) - 1
    for items in linknets:
        if str(search) in items[1]:
            print(sublist)
            linknetsloop.remove(sublist)
            linknetsloop.remove(items)

任何指点将不胜感激

【问题讨论】:

  • 请从linknets发布您想要的输出
  • 我希望链接网的输出与我启动脚本时的输出相同,问题是当我添加另一个脚本失败的随机列表时。
  • 链接网的输出是什么?
  • 这对您来说确实应该是一个简单的调试问题,但是您两次删除了相同的内容。第二次删除它时,它不存在,并且这样说会引发错误。另外,我不知道你为什么将 1 添加到 ipaddress 中,更改它。此外,由于“in”,您将 '100.127.126.17' 与 '100.127.126.173' 和 '100.127.126.171' 匹配
  • 应该是这样,

标签: python for-loop multidimensional-array python-3.5


【解决方案1】:

您很可能想复制linknets的内容:

linknetsloop = list(linknets)

您的原始代码不会复制列表,而只是为同一列表创建别名。然后你在它上面进行迭代,在迭代的同时改变它的内容,这会导致意想不到的结果。

然后,您对linknests 执行双重循环并双重删除:

for sublist in linknets:
    ....
    for items in linknets:
        if <condition>:
            linknetsloop.remove(sublist)
            linknetsloop.remove(items)

sublist==items 和具有该值的项目仅存在一次时,这将引发ValueError 异常。所以你必须考虑这种情况。

另外,可能你有一个错误:

  if str(search) in items[1]:

您不是比较字符串,而是匹配它。因此,例如,如果您的 search 是“10.127.126.16”,它将匹配到“210.127.126.168”。

【讨论】:

  • 它来自于删除循环内的子列表,最多 len(linknets) 次。
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-30
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多