如何在循环列表本身时删除列表元素而不重复它

yur*_*uri 2 python list cycle

我在这个 Python for 语句中浪费了一点时间:

class MyListContainer:
    def __init__(self):
        self.list = []

    def purge(self):
        for object in self.list:
            if (object.my_cond()):
                self.list.remove(object)
        return self.list

container = MyListContainer()

# now suppose both obj.my_cond() return True
obj1 = MyCustomObject(par)
obj2 = MyCustomObject(other_par)

container.list = [obj1, obj2]

# returning not an empty list but [obj2]
container.purge()
Run Code Online (Sandbox Code Playgroud)

它没有像我预期的那样工作,因为当“清除”中的循环删除列表中的第一个对象时,第二个对象被转移到列表的开头并且循环结束。

我在 for 循环之前解决了重复 self.list 的问题:

...
local_list = self.list[:]
for object in local_list:
...
Run Code Online (Sandbox Code Playgroud)

我认为 for 语句停止工作,因为我正在更改原始列表的长度。有人可以澄清这一点吗?

还有更“优雅”的方式来解决这个问题吗?如果列表中的元素较多,那么每次都复制它似乎不是一个好主意。

也许 filter() 函数是正确的,但我希望有其他方法(如果有)。

我是新手。


总结一下您的有用答案:

  • 切勿编辑正在循环的列表
  • 复制列表或使用列表推导式
  • 复制列表不会浪费你的记忆,或者在这种情况下谁会介意它

Ign*_*ams 5

不要尝试。只是不要。制作副本或生成新列表。