2017-09-12 23 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)次。 –