什么是正确的循环范围

时间:2016-04-25 16:32:33

标签: python for-loop

我想从列表中删除一些数组。但是我使用了错误的范围。 在开始时范围是正确的。 这应该有效,如果变量result [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

只展示一次&#39;是&#39; ?

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

4 个答案:

答案 0 :(得分: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 :(得分:1)

我们说列表中有10个项目。

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

在上一个循环中,您的循环要求输入第十个项目。我的猜测是索引错误发生的地方(尽管也可能是[2:3]调用,取决于列表的内容)

更多的pythonic解决方案

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

答案 2 :(得分:0)

如果要保留相同的列表并以海峡顺序解析它,可以使用while循环来评估每次迭代中的len(result)

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

答案 3 :(得分:0)

首先 - 它的机器人按列表进行迭代而没有得到长度,可能你得到一个错误因为列表的长度在循环期间正在改变 第二个 - 你正试图检查“FillLevel”&#39;在切片的字符串。切片返回一个字符 - 尝试不对您的列表进行调整,但使用过滤后的项目制作新的列表 像这样:

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]