2016-06-28 23 views
0
import os 
os.chdir('G:\\f5_automation') 
r = open('G:\\f5_automation\\uat.list.cmd.txt') 
#print(r.read().replace('\n', '')) 
t = r.read().split('\n') 
for i in range(len(t)): 
    if ('inherited' or 'device-group' or 'partition' or 'template' or 'traffic-group') in t[i]: 
     t.pop(i) 
     print(i,t[i]) 

在上面的代码中,我得到了第9行的索引错误:'if('inherited'or'device-group'... etc。迭代遍历列表和pop()时发生索引错误 - ing元素

我真的不明白,为什么,怎么能我的索引超出范围,如果它是通过使用LEN(T)作为我的范围内完美的长度是多少?

的目标是弹出从我的列表中的任何指标是包含任何这些子字符串。谢谢您的协助!

+1

第9行是print(i,t [i])是否正确?如果是这样,这是有道理的,你不能再访问该位置,因为它已被弹出。在做流行音乐之前尝试打印。应该很好 – FirebladeDan

+0

你的'if'语句在语义上完全无效'python'。它会选择第一个值作为“真”,并测试它是否在你的列表中,而不是检查它是否在其中。 –

+3

你是否意识到'('inherited'或'device-group'或'partition'或'模板'或'流量组')=='继承'。如果你想知道是否有't [i]',使用'any'。 – jonrsharpe

回答

0

发生这种情况是因为您在编辑列表时循环播放, 你首先得到例如10的长度,然后你循环10次。但是一旦你删除了一件东西,这个列表将只有9个长。 解决这个问题的一个方法是创建一个你想要保留的东西的新列表,而不是使用它。

我已经稍微编辑了你的代码并做了类似的事情。

t = ['inherited', 'cookies', 'device-group'] 

interesing_things = [] 
for i in t: 
    if i not in ['inherited', 'device-group', 'partition', 'template', 'traffic-group']: 
     interesing_things.append(i) 
     print(i) 
0

正如很多人在评论中所说的那样,您的代码有几个问题。

or运算符将其左侧和右侧的值视为布尔值,并返回第一个值为True(从左到右)。所以你的括号评估为'继承',因为任何非空字符串是True。因此,即使您的for loop工作正常,您也会弹出仅等于“继承”的元素。

for loop虽然不工作。发生这种情况的原因是,当您循环访问的列表大小发生变化时,如果列表元素实际上等于“继承”并弹出,您将收到索引超出范围错误。

那么,来看看这个:

import os 
os.chdir('G:\\f5_automation') 
r = open('G:\\f5_automation\\uat.list.cmd.txt') 
print(r.read().replace('\n', '')) 
t = r.read().split('\n') 
t_dupl = t[:] 
for i, items in enumerate(t_dupl): 
    if items in ['inherited', 'device-group', 'partition', 'template', 'traffic-group']: 
     print(i, items) 
     t.remove(items) 

通过复制原始列表中,我们可以使用它的项目作为项目的“池子”从挑选和修改的列表,我们真正感兴趣的。

最后,知道pop()方法返回它从列表中移除的项目,这是你不需要的例子。 remove()适合你。


作为一个侧面说明,你也许可以用这个代替你的第5行代码:

with open('G:\\f5_automation\\uat.list.cmd.txt', 'r') as r: 
    t = r.readlines() 

使用with语句的优点是,它会自动处理文件由封闭本身当阅读完成时。最后,不要阅读整个文件并将其拆分为换行符,而只需使用内置的readlines()方法即可。

+0

这对我不起作用。我认为这是因为“继承”,“设备组”等。是也是字符串的列表对象的子字符串。这里是一个例子:'print(t [3]); inherited-traffic-group true'注意'inherited'之前的空格 –

+0

@ChristiandelaPeña要正确地做到这一点,您必须提供您正在阅读的txt的示例。否则我们都在等待我们的时间。在写完所有内容之前,我应该先征求它。 –

0

比方说len(t) == 5

我们会处理i取值[0,1,2,3,4]

我们处理i = 0后,我们从弹出一个t价值。len(t) == 4现在。这意味着错误,如果我们得到i = 4。然而,我们仍然会尝试上升到4,因为我们的range已被编入为4

下一步(i = 1)步骤确保在i = 3上发生错误。

下一步(i = 2)步骤确保在i = 2上发生错误,但已处理该错误。

下一步(i = 3)步骤会产生错误。

相反,你应该做这样的事情:

while t: 
    element = t.pop() 
    print(element) 

在一个侧面说明,你应该替换in检查与集:

qualities_we_need = {'inherited', 'device-group', 'partition'} # put all your qualities here 

然后在循环:

if qualities_we_need & set(element): 
    print(element) 

如果你需要索引,你可以使用一个多变量来跟踪索引我们正在处理的价值,或使用enumerate()