从Python列表中删除特定元素
我想从列表中删除元素“Ecrire”之前的所有\n项。它只适用于第一种情况,而不适用于其他情况,我真的不明白为什么 这是我的密码:从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',
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)