了解循环和多维数组

2024-06-26 00:12:57 发布

您现在位置:Python中文网/ 问答频道 /正文

作为一个爱好项目,我试图在互联网上建立一个公共可用路线听众的网格,为此,我登录到所有这些听众,询问他们认识谁,谁与他们有直接联系。很好,现在我正试着配对。你知道吗

数学很简单,如果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删除(子列表)和 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)

任何提示都将不胜感激


Tags: in列表search错误itemseth1removeipaddress
1条回答
网友
1楼 · 发布于 2024-06-26 00:12:57

很可能您想复制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'匹配,例如。你知道吗

相关问题 更多 >