2017-09-12 57 views
0

作为一个业余爱好项目我试图在互联网上制作一个公共可用路由监听器的网格,为此,我登录到所有人并询问他们他们是谁,他们是谁,直接连接到他们。这工作正常,现在我正在尝试将它们配对。理解循环和多维数组

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

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

运行这一点,我会得到没有错误,但如果我添加其他元素到列表中

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

我得到这个错误:如果我打印出来里面有什么linknetsloop.remove

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(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) 

任何指针将很乐意赞赏

+0

请从'linknets'发布您想要的输出 – Ajax1234

+0

我希望linknets的输出与我启动脚本时的输出相同,问题是当我添加另一个脚本失败的随机列表时。 – BIGFATTOBY

+0

linknets的输出是什么? – Ajax1234

回答

0

最大的可能是你想副本linknets内容:

linknetsloop = list(linknets) 

您的原始代码不复制的清单,而只是创建别名到同一个列表。然后你迭代它,并在迭代时改变它的内容,这将导致意想不到的结果。

然后,你做linknests和双缺失一个双循环:

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

这将提高ValueError异常时sublist==items,并用该值项只出现一次。所以你必须考虑这种情况。

另外,也许你有一个bug:

if str(search) in items[1]: 

你是不是比较字符串,但匹配它。因此,如果您的search为'10 .127.126.16',则它将与'210.127.126.168'匹配。

+0

它是从删除循环内的子列表,直到len(linknets)次。 –