从列表中删除特定元素 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
您应该了解 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)
我想从列表中删除元素 '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
您应该了解 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)