我编写了一个脚本来下载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。
答案 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 = []
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)
为什么这么复杂呢?这是
的onelinerip_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。