用于查找列表

时间:2016-10-19 05:44:57

标签: python list loops integer

我编写了一个脚本来下载aws标签列表然后读取最后一个octect并告诉我哪个是最高的IP。例如。这是返回的标签列表:

['vlslabmc,172.16.0.13 / 24','vlslabmc,172.16.0.5 / 24','vlslabmc,172.16.0.3 / 24','vlslabmc,172.16.0.12 / 24','vlslabmc,172.16.0.16 / 24','vlslabmc,172.16.0.6 / 24','vlslabmc,172.16.0.1 / 24','vlslabmc,172.16.0.11 / 24','vlslabmc,172.16.0.15 / 24','vlslabmc,172.16.0.17 / 24','vlslabmc,172.16.0.4 / 24','vlslabmc,172.16.0.7 / 24','vlslabmc,172.16.0.10 / 24','vlslabmc,172.16.0.9 / 24','vlslabmc,172.16.0.8 / 24','vlslabmc,172.16.0.2 / 24','vlslabmc,172.16.0.14 / 24']

这是我的代码来训练tagLis中最大的IP(注意最大的是17,172.16.0.17)

 21 def findLargestIP():
 22         for i in tagList:
 23                 #remove all the spacing in the tags
 24                 ec2Tags = i.strip()
 25                 #seperate any multiple tags
 26                 ec2SingleTag = ec2Tags.split(',')
 27                 #find the last octect of the ip address
 28                 fullIPTag = ec2SingleTag[1].split('.')
 29                 #remove the CIDR from ip to get the last octect
 30                 lastIPsTag = fullIPTag[3].split('/')
 31                 lastOctect = lastIPsTag[0]
 32                 ipList.append(lastOctect)
 33                 largestIP  = int(ipList[0])
 34                 for latestIP in ipList:
 35                         if int(latestIP) > largestIP:
 36                                 largestIP = latestIP
 37         return largestIP

我不知道为什么......但是当我打印出最大的IP值时,它总是打印出来16.我已经完成了应该工作的代码(我正避免使用max函数,因为我是只是学习编码)

非常感谢任何帮助。

由于

使用下面的答案进行编辑,然后输入问题

好的,所以感谢来自cmarie的线索我得到了它的工作问题主要是

33                 largestIP  = int(ipList[0])

这是以前运行的代码,在列表中添加了一个print语句:

'13']
['13', '5']
['13', '5', '3']
['13', '5', '3', '12']
['13', '5', '3', '12', '16']
16
['13', '5', '3', '12', '16', '6']
16
['13', '5', '3', '12', '16', '6', '1']
16
['13', '5', '3', '12', '16', '6', '1', '11']
16
... ...
['13', '5', '3', '12', '16', '6', '1', '11', '15', '17', '4', '7', '10', '9', '8', '2']
    16
['13', '5', '3', '12', '16', '6', '1', '11', '15', '17', '4', '7', '10', '9', '8', '2', '14']
16

基本上发生的事情是在这个循环中:

33                 largestIP  = int(ipList[0])
 34                 for latestIP in ipList:
 35                         if int(latestIP) > largestIP:
 36                                 largestIP = latestIP

循环停在第1个最大整数。在这种情况下,这是16岁。 *我不知道为什么会这样,但确实如此

这是工作代码:

19 def findLargestIP():
 20         ipList =[]
 21         for i in tagList:
 22                 #remove all the spacing in the tags
 23                 ec2Tags = i.strip()
 24                 #seperate any multiple tags
 25                 ec2SingleTag = ec2Tags.split(',')
 26                 #find the last octect of the ip address
 27                 fullIPTag = ec2SingleTag[1].split('.')
 28                 #remove the CIDR from ip to get the last octect
 29                 lastIPsTag = fullIPTag[3].split('/')
 30                 lastOctect = lastIPsTag[0]
 31                 ipList.append(int(lastOctect))
 32                 print ipList
 33                 largestIP  = 0
 34                 for latestIP in ipList:
 35                         if latestIP > largestIP:
 36                                 largestIP = latestIP
 37                                 print latestIP
 38         print largestIP
 39         return largestIP

结果:

[13, 5, 3, 12, 16]
13
16
[13, 5, 3, 12, 16, 6]
13
16
[13, 5, 3, 12, 16, 6, 1]
13
16
[13, 5, 3, 12, 16, 6, 1, 11]
13
16
[13, 5, 3, 12, 16, 6, 1, 11, 15]
13
16
[13, 5, 3, 12, 16, 6, 1, 11, 15, 17]
13
16
17

注意它找到了17。

4 个答案:

答案 0 :(得分:2)

虽然其他人已经为您提供了一些寻找答案的替代方法,但如果您想继续使用您的程序,可以采用以下方法解决问题:

def findLargestIP():
    ipList = []
    for i in tagList:
        #remove all the spacing in the tags
        ec2Tags = i.strip()
        #seperate any multiple tags
        ec2SingleTag = ec2Tags.split(',')
        #find the last octect of the ip address
        fullIPTag = ec2SingleTag[1].split('.')
        #remove the CIDR from ip to get the last octect
        lastIPsTag = fullIPTag[3].split('/')
        lastOctect = lastIPsTag[0]
        ipList.append(int(lastOctect))
    largestIP  = 0
    for latestIP in ipList:
        if latestIP > largestIP:
            largestIP = latestIP
    return largestIP

与此和您的计划的不同之处在于我:

  • 设置ipList = []
  • make ipList包含整数,而不是字符串
  • 设置largestIP = 0,而不是取第一个ipList号码(因为你不应该假设列表已经排序)
  • 删除循环以找到第一个循环之外的最大数字[在tagList] - 仅用于消除不必要的迭代

但是,如果我要执行该任务,我会尝试使用正则表达式。这是一种方法:

import re
def alternativeFindLargestIP():
    ipList = re.findall(r'(?<=\.)\d+(?=/)', ' '.join(tagList))
    ipList = [int(num) for num in ipList]
    return max(ipList)

答案 1 :(得分:1)

为什么这么复杂呢?这是

的oneliner
ip_list = ['vlslabmc, 172.16.0.13/24', 'vlslabmc,172.16.0.5/24', 'vlslabmc,172.16.0.3/24', 'vlslabmc,172.16.0.12/24', 'vlslabmc,172.16.0.16/24', 'vlslabmc,172.16.0.6/24', 'vlslabmc,172.16.0.1/24', 'vlslabmc,172.16.0.11/24', 'vlslabmc,172.16.0.15/24', 'vlslabmc,172.16.0.17/24', 'vlslabmc,172.16.0.4/24', 'vlslabmc,172.16.0.7/24', 'vlslabmc,172.16.0.10/24', 'vlslabmc,172.16.0.9/24', 'vlslabmc,172.16.0.8/24', 'vlslabmc,172.16.0.2/24', 'vlslabmc,172.16.0.14/24']

largestIP = max(ip_list, key=lambda i: int(i.split('/')[0].split('.')[-1]))

答案 2 :(得分:1)

代码非常复杂(远远超过需要),但错误是ipList填充了字符串,然后将其元素与整数进行比较。

这在Python 2中是一个沉默的问题来源(在比较不同的类型而不是错误时,你得到了一个无意义但稳定的True / False结果),而在Python 3中它变成了一个错误。

在我看来,一个更简单的实现是:

return max(int(x.split(",")[1].split("/")[0].split(".")[-1])
           for x in taglist)

含义:

  • split(",")[1]以逗号后面的部分
  • split("/")[0]参加斜线前的部分
  • split(".")[-1]取IP地址的最后一部分
  • int(...)转换为整数
  • max(... for x in taglist为所有元素执行此操作并保持最大值

或使用正则表达式

return max(int(re.match(".*?([0-9]+)/", x).group(1))
           for x in taglist)

答案 3 :(得分:0)

所以我必须稍微重构你的代码。我假设ipList是一个空列表。你确定你测试过它是否真的跑了吗?特别是你的if语句

if int(latestIP) > largestIP:
    largestIP = latestIP

会返回

TypeError: unorderable types: int() > str()

因为您将字符串分配给largestIP,然后在下一次迭代中,您将比较字符串和int。除此之外,您的代码似乎功能齐全。它返回17作为我最大的最后一个八位字节似乎是正确的。

如果您的目的是返回IP地址列表中最大的最后一个八位字节,您可能希望以不同的方式处理此问题。

选项1:首先累积IP地址列表

不是在循环中嵌套for循环来遍历所有标记,您可以先累积标记,然后查找最大值。通过这种方式,您可以浏览一次标记列表,然后遍历ip列表,而不是每次遍历标记列表时都通过整个ip列表。

选项2:创建仅包含最后一个八位字节的列表

与选项1类似,您将遍历您的tagList,并将所有已转换为int的IP地址的最后八位字节累积到列表中,而不是整个IP地址。在之后的循环中,您可以使用八位字节在列表中调用max(我猜您要避免这种情况)。

选项3:拥有最大值

我认为这是最好的解决方案。当您浏览标记列表时,您可以保留一个到目前为止具有最大最后一个八位字节的变量。这样你只需要遍历标签列表一次,到目前为止仍然是最后一个八位字节。

如果您想获取整个IP地址,选项1和3仍然有效,但对于选项2,您可能需要查看python dictionaries