从列表中逐步删除元素

Stepwise removal of elements from a list

我想 运行 浏览一个列表并确保它符合特定条件。该列表如下所示:

mylist = ["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog"]

我希望能够遍历此列表,每次遇到“-”时,将该元素与它之前的元素进行比较。如果这两个元素相同(“-”除外),则两者都将被删除,并且该过程将再次进行。所以它最终会看起来像这样:

["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog"]
["dog", "a", "cat", "-cat", "-a", "-dog"]
["dog", "a", "-a", "-dog"]
["dog", "-dog"]
[]

其中 [] 是未来将使用的产品(所以其他东西不需要打印或显示,这只是我想象的过程 Python 为了获得到最后)。

如果正在比较的列表在某个时候不符合删除标准,则可以停止操作。因此,对于如下所示的列表:

newlist = ["dog", "a", "b", "-a", "-b", "-dog"]

因为遇到的第一个“-”将与 "a" 关联,但前面的元素是 "b"

我试图用 for 循环解决这个问题:

lt4 = []
lt5 = []
for i in mylist:
    for j in i+1:
        if [j] == [j-1]:
            temp = i[-j:j+1]
            lt4.append(temp)
    lt5.append(lt4)

我意识到这是一个粗略的尝试,显然是行不通的;目前我收到类型错误,因为在循环中使用带有迭代变量的整数。任何帮助总是非常感谢。

我可能会在这里选择递归解决方案。

运行 在列表中查找任何互补的配对。如果找到一个,则将其删除并递归调用以删除可能出现的任何新值:

def remove_negatives(inputs):
    print(inputs)
    for i in range(0, len(inputs) - 1):
        prev = inputs[i]
        next = inputs[i + 1]
        if len(next) > 0 and next[0] == '-' and prev == next[1:]:
            return remove_negatives(inputs[:i] + inputs[i + 2:])
    return inputs


start_list = ["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog"]
end_list = remove_negatives(start_list)

打印:

['dog', 'a', 'b', '-b', 'cat', '-cat', '-a', '-dog']
['dog', 'a', 'cat', '-cat', '-a', '-dog']
['dog', 'a', '-a', '-dog']
['dog', '-dog']
[]

问题可以使用堆栈来解决 - 或者至少将结果列表视为堆栈。 (试着研究一下主题...是你的朋友)

mylist = ["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog"]
# mylist = ["dog", "a", "b", "-a", "-b", "-dog"]

result=[]
for v in mylist:
  if len(result)>0 and v=='-'+result[-1]:
    result.pop()
  else:
    result.append(v)

print(result)

接受的答案不适用于包含连字符的值位于不包含连字符的值之前的列表,例如mylist = ['-a','a']

我会使用类似下面的东西

mylist = ["dog", "a", "b", "-b", "cat", "-cat", "-a", "-dog", 'z','-y']
newList = mylist.copy()
for i in mylist:
    if "-" in i:
        if i.replace("-","",1) in mylist:
            newList.remove(i)
            newList.remove(i.replace("-","",1))
print(newList)