Python 如果元素包含'&燃气轮机&引用;

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

每当元素中有“>”时,我都会尝试将“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 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)
谢谢!反向循环解决了这个问题!你能给我一个输入和所需输出的例子吗?我真的很想给出我的输入和所需的输出,但这让问题变得非常复杂,所以我解决了我遇到的具体错误。我很感谢你对我的评论所作的解释!这些范围包括对于我来说,我更喜欢更清晰的
反转(范围(…)
我感谢您对我的评论所作的解释!这种范围让我感到困惑,我更喜欢更清晰的
反转(范围(…)