如果列表中的项目满足条件,删除项目和多个前面的项目

If item in list meets condition, remove item and multiple preceding items

我正在寻找一种方法来删除列表中的每个 nth 项(我们称该项为 i) , andx 列表中直接在 i 之前的项目数,如果 i满足条件

我一直在四处查看列表推导和迭代,但新手很难找到解决方案。

示例:

myList = ["you", "are", "right", "I", "am", "wrong"]

对于每个 第 3 项,检查是否 i == "wrong": 如果是这样,删除 itwo (2) 项目 preceding i.

作用:序列"I, "am", "wrong"从列表中删除

>>> myList = ["you", "are", "right", "I", "am", "wrong"]
>>> for i, l in enumerate(myList):
...   if l == 'wrong':
...     myList = myList[:i-2]
...     break
... 
>>> myList
['you', 'are', 'right']

当然你可以让2成为一个变量

以你的例子为例,

new_list = [v for i, v in enumerate(myList)
            if myList[3*int(i/3)+2] != 'wrong']

这是可行的,因为您不想复制以 'wrong' 结尾的整组 3 项。如果您只想删除该组的一部分或不在该组中的某些项目,则会更加复杂。例如,如果您想删除 'wrong' 值和它之前的值,您可以使用

new_list = [v for i, v in enumerate(myList)
            if myList[3*(i/3)+2] != 'wrong' or i % 3 == 0]

这里是 numpy.delete 的解决方案。 Numpy.delete 使用索引删除元素。这样你就可以找到对应的匹配项,把前面的删掉就可以了。

In [1]: import numpy as np
In [2]: myList = ["you", "are", "right", "I", "am", "wrong"]
In [3]: for i,j in enumerate(myList):
    if j == 'wrong':
        out = np.delete(myList,[i-2,i-1,i]).tolist()
   ....:      
In [4]: out
Out[1]: ['you', 'are', 'right']