从Python列表中删除特定元素

2024-03-28 08:30:48 发布

您现在位置: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')]

Tags: 元素密码列表indexab情况tbnote
3条回答

两个问题:在对列表进行迭代时修改列表,并且.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('|')

index调用将始终返回字符串的第一个实例。在这种情况下,你真的想循环列表的索引,而不是直接循环列表的元素

还请注意you can't ^{} elements from the list you are currently traversing;但是,当然,当您循环一个间接索引时,您可以,只要您在任何IndexError上进行termrnate

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中常规变量的名称不应大写;大写的名称通常是类名

相关问题 更多 >