从列表中删除特定元素 Python

Remove specific elements from list Python

我想从列表中删除元素 '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')]

index 调用将始终 return 字符串的第一个实例。这是您真正想要遍历列表索引而不是直接遍历其元素的情况之一。

另请注意you can't del elements from the list you are currently traversing;但是当然,当你遍历一个间接索引时,你可以,只要你在任何 IndexError.

上终止
for idx in range(len(Corps2)-1):
    try:
        if Corps2[idx] == '\n' and Corps2[idx+1] == 'Ecrire:
            del Corps2[idx]
    except IndexError:
         break

演示:https://ideone.com/LhEvUB

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

切线地,在 Python 中,您通常不应将常规变量的名称大写;大写的名称通常是 class 个名称。

两个问题:在遍历列表的同时修改列表,.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]

请注意,如果您在标记化字符串之前对其进行处理,您可以先执行 .replace('\nEcrire','Ecrire')

仅供参考,元素 '≥' 表示字符串解码不正确:

>>> '≥'.encode('cp1252').decode('utf8')
'≥'

这一行将完成您需要的事情:

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)