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