Python 正确的环路范围是多少

Python 正确的环路范围是多少,python,for-loop,Python,For Loop,我想从列表中删除一些数组。但我用错了射程。 开始时,范围正确。 如果变量result[b][2:3]中有字符串,则删除结果[b] for b in range(len(result)): if 'FillLevel' in result[b][2:3]: del result[b] 在此之后,出现错误:indexer:list索引超出范围 我要查找此字符串并删除整行(数组): 为什么要使用此代码: print(result[4][2:3]) print(result

我想从列表中删除一些数组。但我用错了射程。 开始时,范围正确。 如果变量result[b][2:3]中有字符串,则删除结果[b]

for b in range(len(result)):
    if 'FillLevel' in result[b][2:3]:
        del result[b]
在此之后,出现错误:indexer:list索引超出范围


我要查找此字符串并删除整行(数组):


为什么要使用此代码:

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

问题是
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]

问题是
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]

假设列表中有10项

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

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

一个更具python风格的解决方案是

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

假设列表中有10项

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

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

一个更具python风格的解决方案是

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

如果要保留相同的列表并按顺序解析,可以使用while循环,在每次迭代中计算
len(result)

b = 0
while b < len(result) :
    if 'FillLevel' in result[b][2:3]:
        del result[b]
    b += 1 
b=0
而b
如果要保留相同的列表并按顺序解析,可以使用while循环,在每次迭代中计算
len(result)

b = 0
while b < len(result) :
    if 'FillLevel' in result[b][2:3]:
        del result[b]
    b += 1 
b=0
而b
第一个 -在不获取长度的情况下按列表进行迭代是很容易的,可能是因为在循环过程中列表的长度发生了变化,所以您得到了一个错误 第二 -您正在尝试检查字符串切片中的“FillLevel”。切片返回一个字符 -尽量不要混音你的列表,而是用过滤过的项目制作一个新的列表 像这样:

new_list = []
for b in result:
    if 'FillLevel' not in b:
        new_list.append(b)
或检查并键入以下内容:

[i for i in result if 'FillLevel' not in i]
首先 -在不获取长度的情况下按列表进行迭代是很容易的,可能是因为在循环过程中列表的长度发生了变化,所以您得到了一个错误 第二 -您正在尝试检查字符串切片中的“FillLevel”。切片返回一个字符 -尽量不要混音你的列表,而是用过滤过的项目制作一个新的列表 像这样:

new_list = []
for b in result:
    if 'FillLevel' not in b:
        new_list.append(b)
或检查并键入以下内容:

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

“变量结果[b][2:3]中的if字符串”是什么意思?我不确定这是否有意义。请参阅以了解如何从列表中删除项目。@MatthewCliatt这确实有意义,但很可能与'FillLevel'==result[b][2]
@MatthewCliatt没有任何区别。我想这意味着,
result[b]
是一个字符串数组,所以
result[b][2:3]
将是一个string@AustinHastings如果您认为这个问题以前已经被问过并回答过,那么请将其标记为重复。您所说的“变量结果[b][2:3]中的If字符串”是什么意思?我不确定这是否有意义。请参阅以了解如何从列表中删除项目。@MatthewCliatt这确实有意义,但很可能与'FillLevel'==result[b][2]@MatthewCliatt没有任何区别。我想这意味着,
result[b]
是一个字符串数组,所以
result[b][2:3]
将是一个string@AustinHastings如果您认为这个问题以前已经被问过并回答过,那么请将其标记为重复。我正在尝试使用您的第一个解决方案。但是如果我有
FillLevel[5],FillLevel[7]
等等,这就不起作用了。我尝试使用
if'FillLevel['not in b
-但这也不起作用。可能您的切片没有用处,我可能会对您的“result”内容产生错误。尝试将其添加到此处:if'FillLevel'not in b[2]:我尝试使用您的第一个解决方案。但如果我有
FillLevel[5],FillLevel[7],这也不起作用
。等。我尝试使用
if'FillLevel['不在b中
-但这也不起作用。可能您的切片没有用处,我可能会对您的'result'内容产生错误。尝试将其添加到此处:if'FillLevel'不在b[2]中: