从python中找到一个最大的整数

2024-09-28 03:17:18 发布

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

我编写了一个脚本来下拉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(注意,最大的是17172.16.0.17)

^{pr2}$

我不知道为什么。。但当我打印largestIP的值时,它总是打印出16。我已经看过了应该有效的代码(我避免使用max函数,因为我只是在学习编码)

如有任何帮助,我们将不胜感激。在

谢谢

用下面的答案和问题进行编辑

好吧,多亏了cmarie的线索,我找到了它,问题主要是

33                 largestIP  = int(ipList[0])

下面是前面运行的代码,在list append中添加了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

循环在第一个最大整数处停止。在这个例子中是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个。在


Tags: the代码in标记ip列表forint
3条回答

代码相当复杂(远远超出需要),但错误是ipList被字符串填充,然后将其元素与整数进行比较。在

这在Python2中是一个无声的问题源(在比较不同类型时,您得到了一个无意义但稳定的True/False的结果),而在python3中,它变成了一个错误。在

在我看来,更简单的实现方式是:

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对所有元素执行此操作并保持最大

或者使用regexp

^{pr2}$

虽然其他人已经为您提供了一些其他方法来找到答案,但如果您想继续使用您的程序,以下是一些解决方法:

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 = []
  • 使ipList包含整数,而不是字符串
  • 设置largestIP = 0,而不是取ipList的第一个数字(因为您不应该假定列表是排序的)
  • 删除循环以找到第一个循环之外的最大数[在tagList上]——只是为了消除不必要的迭代

但是,如果我要做这个任务,我会尝试使用正则表达式。以下是一种方法:

^{pr2}$

为什么这么复杂。这是一条线

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

相关问题 更多 >

    热门问题