无法删除python列表中带有冒号的字符串项

无法删除python列表中带有冒号的字符串项,python,Python,因此,在用python编写代码时,我遇到了以下问题:我在这样的列表中有几个字符串项: ['X','Y','Z','A', 'B:C', 'D'] 我想删除所有过去的'Z'。我使用以下代码尝试此操作: for item in lines: if ((item == "A")): lines.remove(item) if (item == "B:C"): lines.remove(item) if (item == "D"): lines

因此,在用python编写代码时,我遇到了以下问题:我在这样的列表中有几个字符串项:

['X','Y','Z','A', 'B:C', 'D']
我想删除所有过去的
'Z'
。我使用以下代码尝试此操作:

for item in lines:
   if ((item == "A")):
      lines.remove(item)

   if (item == "B:C"):
      lines.remove(item)

   if (item == "D"):
      lines.remove(item)
A
D
被完美移除。但是,
B:C
不会被删除并保留在列表中

请注意,
A、D、B:C
等表示字符串,而不是字符(例如,
A
可能是
事务失败!
B:C
可能表示
写入失败:无法完成!


如何解决这个问题?

您可以使用
.index()
方法查找列表中特定元素的索引

然后,在找到
z_索引之后,您可以通过切片第一个列表来创建另一个列表

下面是一个例子:

l1 = ['X','Y','Z','A', 'B:C', 'D']

#finding index of element 'Z'
z_index = l1.index('Z')

#slicing list from 0 until z_index
l2 = l1[:z_index]

print l2
输出:

['X', 'Y']

您可以使用
.index()
方法查找列表中特定元素的索引

然后,在找到
z_索引之后,您可以通过切片第一个列表来创建另一个列表

下面是一个例子:

l1 = ['X','Y','Z','A', 'B:C', 'D']

#finding index of element 'Z'
z_index = l1.index('Z')

#slicing list from 0 until z_index
l2 = l1[:z_index]

print l2
输出:

['X', 'Y']

在迭代时修改列表通常是一件坏事。删除当前元素时,会跳过某些元素。您可以通过迭代
反向(行)
来修复它,但最好创建一个没有要删除的元素的新列表:

to_remove = {'A', 'B:C', 'D'}
new_lines = [line for line in lines if line not in to_remove]
或者,如果要就地修改:

to_remove = {'A', 'B:C', 'D'}
lines[:] = [line for line in lines if line not in to_remove]

在迭代时修改列表通常是一件坏事。删除当前元素时,会跳过某些元素。您可以通过迭代
反向(行)
来修复它,但最好创建一个没有要删除的元素的新列表:

to_remove = {'A', 'B:C', 'D'}
new_lines = [line for line in lines if line not in to_remove]
或者,如果要就地修改:

to_remove = {'A', 'B:C', 'D'}
lines[:] = [line for line in lines if line not in to_remove]

通常,从正在迭代的列表中删除元素不是一个好主意。在你的情况下,你可以考虑用你想要的结果创建一个新的列表:

l = ['X','Y','Z','A', 'B:C', 'D']
clean_l = [i for i in l if i not in ('A', 'B:C', 'D')]
如果知道要删除哪些元素,这是一个很好的选择。但是,如果您知道在“Z”之后不需要任何内容,而不管它们的值如何,则只需对列表进行切片:

clean_l = l[:l.index('Z') + 1]

通常,从正在迭代的列表中删除元素不是一个好主意。在你的情况下,你可以考虑用你想要的结果创建一个新的列表:

l = ['X','Y','Z','A', 'B:C', 'D']
clean_l = [i for i in l if i not in ('A', 'B:C', 'D')]
如果知道要删除哪些元素,这是一个很好的选择。但是,如果您知道在“Z”之后不需要任何内容,而不管它们的值如何,则只需对列表进行切片:

clean_l = l[:l.index('Z') + 1]

首先,您需要使用index()方法查找“Z”的位置

然后,要删除z之后的所有内容,我将执行以下操作:

del x[postion+1:]

您必须向该位置添加一个,否则它也会删除“Z”

首先,您需要使用index()方法查找“Z”的位置

然后,要删除z之后的所有内容,我将执行以下操作:

del x[postion+1:]

您必须向位置添加一个,否则它也会删除“Z”

切片如何<代码>行[:1+行.index('Z')]
您不应该在迭代列表时修改列表…可能是因为您正在迭代列表,并且一旦删除元素(
'A'
),它跳过了下一个?我不明白为什么你一开始就迭代它,因为你已经知道你要删除什么。切片呢<代码>行[:1+行.index('Z')]
您不应该在迭代列表时修改列表…可能是因为您正在迭代列表,并且一旦删除元素(
'A'
),它跳过了下一个?我不明白你为什么要首先迭代它,因为你已经知道要删除什么。所以我需要在删除它们之前先检查这些字符串。例如,我需要检查“事务失败!”。所以迭代是不可避免的?如果你需要分割列表,这是正确的解决方案。如果出于某种原因对列表进行额外检查,则使用列表理解解决方案。如果要删除列表中的项目,则应避免迭代<代码>切片或
使用
条件语句创建一个新的
通常是一种更好的做法。因此,在删除这些字符串之前,我需要先检查它们。例如,我需要检查“事务失败!”。所以迭代是不可避免的?如果你需要分割列表,这是正确的解决方案。如果出于某种原因对列表进行额外检查,则使用列表理解解决方案。如果要删除列表中的项目,则应避免迭代<代码>切片
使用
条件语句创建一个新的
通常是更好的做法。是p.index还是x.index?是p.index还是x.index?