Python 如果元素包含'&燃气轮机&引用;
每当元素中有“>”时,我都会尝试将“a”插入到filecontent列表中。下面的代码成功地在“>”之后插入了一个“a”元素,最后2个“>”元素除外。我不明白为什么Python 如果元素包含'&燃气轮机&引用;,python,list,Python,List,每当元素中有“>”时,我都会尝试将“a”插入到filecontent列表中。下面的代码成功地在“>”之后插入了一个“a”元素,最后2个“>”元素除外。我不明白为什么 def specialparseFile(fname): filesContent = list() with open(fname) as f: lines = [i.strip() for i in f] lines = [line for line in lines if lin
def specialparseFile(fname):
filesContent = list()
with open(fname) as f:
lines = [i.strip() for i in f]
lines = [line for line in lines if line]
for i in lines:
filesContent.append(i)
for x in range(len(filesContent)):
if '>' in filesContent[x]:
filesContent.insert(x + 1, 'a')
print(filesContent)
return filesContent
也可以在同一个循环中执行这两项操作
...
for item in lines:
filesContent.append(item)
if ">" in item:
filesContent.append( "a" )
也可以在同一个循环中执行这两项操作
...
for item in lines:
filesContent.append(item)
if ">" in item:
filesContent.append( "a" )
例如,假设您的
filecontent
是l
:
l = ['>', 'b', '>']
它的长度为3,因此for循环将通过索引0、1和2进行循环。在索引0之后,数组将是:
l = ['>', 'a', 'b', '>']
现在您可以看到您的问题,最后一个
将永远无法到达,因为它位于索引3
您可以反向循环来解决此问题:
range(len(filesContent) - 1, -1, -1)
或者,如果您愿意:
reversed(range(len(filesContent)))
现在通过2,1,0循环,在第一次迭代之后,您将有:
l = ['>', 'b', '>', 'a']
下一个索引是1,很明显,前面的添加不会影响仍然需要循环的列表。例如,假设您的
文件内容是l
:
l = ['>', 'b', '>']
它的长度为3,因此for循环将通过索引0、1和2进行循环。在索引0之后,数组将是:
l = ['>', 'a', 'b', '>']
现在您可以看到您的问题,最后一个
将永远无法到达,因为它位于索引3
您可以反向循环来解决此问题:
range(len(filesContent) - 1, -1, -1)
或者,如果您愿意:
reversed(range(len(filesContent)))
现在通过2,1,0循环,在第一次迭代之后,您将有:
l = ['>', 'b', '>', 'a']
下一个索引是1,很明显,前面的添加不会影响仍然需要循环的列表。您的错误的根本原因已经在@Nick A的答案中得到了很好的解释,另一种方法是使用以下代码删除for
循环,并完全忘记列表的索引:
def specialparseFile(fname):
with open(fname) as f:
lines = filter(None, map(lambda x: x.strip(), f))
result = [[l, 'a'] if '<' in l else [l] for l in lines]
return sum(result, []) # flatten the nested list generated by previous line of code
def specialparseFile(fname):
将open(fname)作为f:
行=过滤器(无,映射(lambda x:x.strip(),f))
result=[[l,'a']如果@Nick a的答案中已经很好地解释了bug的根本原因,那么另一种方法是使用以下代码删除for
循环,并完全忘记列表的索引:
def specialparseFile(fname):
with open(fname) as f:
lines = filter(None, map(lambda x: x.strip(), f))
result = [[l, 'a'] if '<' in l else [l] for l in lines]
return sum(result, []) # flatten the nested list generated by previous line of code
def specialparseFile(fname):
将open(fname)作为f:
行=过滤器(无,映射(lambda x:x.strip(),f))
result=[[l,'a']if',因为filecontent
的长度在添加到它时会发生变化。请尝试向后循环,range(len(filecontent)-1,-1,-1)
谢谢!反向循环解决了这个问题!你能给我一个输入和所需输出的例子吗?我真的很想给出我的输入和所需的输出,但这让问题变得非常复杂,所以我解决了我遇到的特定错误。因为filecontent
的长度在添加到它时会发生变化。请尝试l向后oop,范围(len(filecontent)-1,-1,-1)
谢谢!反向循环解决了这个问题!你能给我一个输入和所需输出的例子吗?我真的很想给出我的输入和所需的输出,但这让问题变得非常复杂,所以我解决了我遇到的具体错误。我很感谢你对我的评论所作的解释!这些范围包括对于我来说,我更喜欢更清晰的反转(范围(…)
我感谢您对我的评论所作的解释!这种范围让我感到困惑,我更喜欢更清晰的反转(范围(…)