从Python列表中删除特定元素

从Python列表中删除特定元素,python,list,for-loop,if-statement,del,Python,List,For Loop,If Statement,Del,我想从列表中删除元素“Ecrire”之前的所有\n项。它只适用于第一种情况,而不适用于其他情况,我真的不明白为什么 这是我的密码: Corps2 = ['Debut', '\n', '\n', 'Note', ' ', '<-', ' ', 'Saisie()', ' ', '', '\n', '\n', 'Selon que\n', ' ', 'Note', ' ', '≥', ' ', '16', ' ', '', ' ', '', ' ', ':', ' ', '', '\n',

我想从列表中删除元素“Ecrire”之前的所有\n项。它只适用于第一种情况,而不适用于其他情况,我真的不明白为什么 这是我的密码:

Corps2 = ['Debut', '\n', '\n', 'Note', ' ', '<-', ' ', 'Saisie()', ' ', '', '\n', '\n', 'Selon que\n', ' ', 'Note', ' ', '≥', ' ', '16', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('TB')", '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '14', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('B')", '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '12', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('AB')", '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '10', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('Passable')", '\n', '\n', 'Sinon', ' ', ':', ' ', 'Ecrire', ' ', "('Redoublant')", '\n', '\n', 'Fin_Si']
for i in Corps2:
    if i =='Ecrire' and Corps2[Corps2.index('Ecrire')-2 :Corps2.index('Ecrire')]==['\n','\n'] :
        del Corps2[Corps2.index('Ecrire')-2 :Corps2.index('Ecrire')]
索引调用将始终返回字符串的第一个实例。在这种情况下,你真的想循环列表的索引,而不是直接循环列表的元素

还请注意;当然,当你循环一个间接索引时,你可以,只要你在任何一个索引器上做标记

对于rangelenCorps2-1中的idx: 尝试: 如果Corps2[idx]=='\n'和Corps2[idx+1]==='Ecrire: 德尔科普斯2[idx] 除索引器外: 打破 演示:

您应该了解索引器是如何发生的-您正在缩短每个已删除元素的列表,因此计算出的结束索引将超出列表的结尾,超出了那么多项。此外,幸运的是,我们已经知道,替换'\n'的元素永远不会是'\n',也就是说,因为它将是'Ecrire',因此如果不是这种情况,我们可以方便地避免所需的复杂性


切题地说,Python中常规变量的名称不应大写;大写的名称通常是类名。

两个问题:在对列表进行迭代时修改列表,以及.index只查找第一项

下面查找所有要删除的位置,然后按相反顺序删除它们,以便索引不会指向错误的元素,如果在正向方向删除,则会发生这种情况:

Corps2 = ['Debut', '\n', '\n', 'Note', ' ', '<-', ' ', 'Saisie()', ' ', '', '\n', '\n', 'Selon que\n', ' ', 'Note', ' ', '≥', ' ', '16', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('TB')", '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '14', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('B')", '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '12', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('AB')", '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '10', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('Passable')", '\n', '\n', 'Sinon', ' ', ':', ' ', 'Ecrire', ' ', "('Redoublant')", '\n', '\n', 'Fin_Si']
to_delete = [i for i,v in enumerate(Corps2) if v == 'Ecrire']
for i in reversed(to_delete):
    del Corps2[i-1]

这一行可以满足您的需要:

Corps2='|'.join(Corps2).replace('|\n|\n|Ecrire','Ecrire').split('|')

也看看这个。每当从数组中删除“\n”时,都会发生索引更改

Corps2 = ['Debut', '\n', '\n', 'Note', ' ', '<-', ' ', 'Saisie()', ' ', '', '\n', '\n', 'Selon que\n', ' ', 'Note', ' ',
          '≥', ' ', '16', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('TB')", '\n', '\n', '',
          ' ', 'Note', ' ', '≥', ' ', '14', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('B')",
          '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '12', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire',
          ' ', "('AB')", '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '10', ' ', '', ' ', '', ' ', ':', ' ', '', '\n',
          '\n', 'Ecrire', ' ', "('Passable')", '\n', '\n', 'Sinon', ' ', ':', ' ', 'Ecrire', ' ', "('Redoublant')",
          '\n', '\n', 'Fin_Si']
Ecrire_count = Corps2.count("Ecrire")
for counter in range(Ecrire_count - 1):
    for i in range(len(Corps2)):
        if Corps2[i+2] == 'Ecrire' and Corps2[i+1] == '\n' and Corps2[i] == '\n':
            del Corps2[i:i+2]
            break

print(Corps2)

欢迎来到SO!看看这本书。您的代码很难理解,因为有很多不相关的数据,而且Corps2.index'Ecrire'重复太多。请提供,这也意味着提供您的预期输出和实际输出。您还说要删除“\n”,但代码似乎会删除多个项目提示:Corps2。索引“Ecrire”将只返回第一次出现的项目。试试enumerateCorps2中的i,word:……在遍历列表时从列表中删除元素也不太好。@MarkTolonen在一般情况下不会,但是如果您单调地遍历列表并避免索引错误,并且理解在删除元素时会跳过元素,这是可能的。在这里,跳过Ecrire元素甚至可以被视为一项功能。@Mark感谢您的反馈;我添加了一些警告。
Corps2 = ['Debut', '\n', '\n', 'Note', ' ', '<-', ' ', 'Saisie()', ' ', '', '\n', '\n', 'Selon que\n', ' ', 'Note', ' ',
          '≥', ' ', '16', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('TB')", '\n', '\n', '',
          ' ', 'Note', ' ', '≥', ' ', '14', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire', ' ', "('B')",
          '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '12', ' ', '', ' ', '', ' ', ':', ' ', '', '\n', '\n', 'Ecrire',
          ' ', "('AB')", '\n', '\n', '', ' ', 'Note', ' ', '≥', ' ', '10', ' ', '', ' ', '', ' ', ':', ' ', '', '\n',
          '\n', 'Ecrire', ' ', "('Passable')", '\n', '\n', 'Sinon', ' ', ':', ' ', 'Ecrire', ' ', "('Redoublant')",
          '\n', '\n', 'Fin_Si']
Ecrire_count = Corps2.count("Ecrire")
for counter in range(Ecrire_count - 1):
    for i in range(len(Corps2)):
        if Corps2[i+2] == 'Ecrire' and Corps2[i+1] == '\n' and Corps2[i] == '\n':
            del Corps2[i:i+2]
            break

print(Corps2)