2016-04-25 141 views
0

我想从列表中删除一些数组。但是我使用了错误的范围。 开始时范围是正确的。 这应该工作,如果字符串中变量的结果并[b] [2:3]然后删除结果并[b]什么是正确的回路范围

for b in range(len(result)): 
    if 'FillLevel' in result[b][2:3]: 
     del result[b] 

之后我有错误:IndexError:列表索引超出范围


我想找到这个字符串,并删除整行(阵列):

V;4;FillLevel[1];CPUA.DB1610.0,I0,64;RW 
V;4;FillLevel[2];CPUA.DB1610.0,I;RW 
V;4;FillLevel[5];CPUA.DB1610.6,I;RW 
V;4;FillLevel[6];CPUA.DB1610.8,I;RW 
V;4;FillLevel[11];CPUA.DB1610.18,I;RW 

为什么这段代码:

print(result[4][2:3]) 
print(result[5][2:3]) 
print(result[6][2:3]) 
print(result[7][2:3]) 
print(result[8][2:3]) 
print(result[9][2:3]) 
print(result[10][2:3]) 

b = 0 
while b < len(result): 
    if 'FillLevel' in result[b][2:3]: 
     del result[b] 
     del adress[b] 
     print('yes') 
    b += 1 

只显示一次'是'?

['FillLevel'] 
['FillLevel[1]'] 
['FillLevel[2]'] 
['FillLevel[3]'] 
['FillLevel[4]'] 
['FillLevel[5]'] 
['FillLevel[6]'] 
yes 
+0

你是什么意思** *“如果字符串变量结果[b] [2:3]”***?我不确定这是否合理。 –

+1

请参阅[本答案](http:// stackoverflow。com/questions/1207406/remove-items-from-a-list-while-iterating-in-python)了解如何从列表中删除项目。 –

+0

@MatthewCliatt它确实有道理,但它很可能与'if'FillLevel'== result [b] [2]'没有什么不同。 –

回答

1

的问题是,del result[b]改变组合物(和的长度)result,从而与循环干扰。

也许是为了解决这个问题最简单的方法是通过改写你的代码清单理解:

result = [r for r in result if 'FillLevel' not in r[2:3]] 

或者,你可以通过反向迭代修复:

for b in range(len(result) - 1, -1, -1): 
    if 'FillLevel' in result[b][2:3]: 
     del result[b] 
1

比方说,有列表中的10个项目。

通过您的中途删除其中一个项目;现在列表中有9个项目。

在上一个循环中,您的循环要求第十个项目。我的猜测是,也正是指数误差正在发生的事情(尽管它可能是由于[2:3]通话以及,根据您的列表中的内容)

一个更Python的解决办法是

result = [val for val in result if 'FillLevel' not in val[2:3]] 
0

如果您要保持相同的列表,并解析它在海峡顺序,你可以使用while循环,其评估每个迭代

b = 0 
while b < len(result) : 
    if 'FillLevel' in result[b][2:3]: 
     del result[b] 
    b += 1 
+0

问题已更新。 – Luka

0

为第一 的len(result) - 这是马赫easyer通过列表机智迭代热得到长度,可能你得到一个错误因为长度的列表正在改变在循环 第二 - 你正试图检查'FillLevel'的字符串片。切片返回一个字符 - 尽量不midify您的列表,但使新的有过滤项 这样的:

new_list = [] 
for b in result: 
    if 'FillLevel' not in b: 
     new_list.append(b) 

或检查约List Comprehensions和输入:

[i for i in result if 'FillLevel' not in i] 
+0

我正在尝试使用你的第一个解决方案。但是如果我有'FillLevel [5],FillLevel [7]'..等等,这是行不通的。 我试图使用'如果'FillLevel ['不在b' - 但这也行不通。 – Luka

+0

可能你的切片不是无用的,我可能对你的'结果'内容错误。尝试在这里添加它:如果'FillLevel'不在b [2]中: – Matroskin