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

2024-10-01 17:33:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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()

它并不像我预期的那样工作,因为当“purge”中的循环删除列表中的第一个对象时,第二个对象将移到列表的开头,循环结束。在

我解决了复制问题自我列表在for循环之前:

^{pr2}$

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

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

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

我是个新手。在


总结一下你有用的答案:

  • 永远不要编辑正在循环的列表
  • 复制列表或使用列表理解
  • 复制一张单子不会浪费你的记忆,在这种情况下谁会介意呢

Tags: self列表forreturnobjectmycontainerdef
3条回答

给自己列一个新的清单:

def purge(self):
    self.list = [object for object in self.list if not object.my_cond()]
    return self.list

保留任何优化,直到您分析并发现此方法确实是应用程序的瓶颈。(我打赌不会的。)

不要尝试。只是不要。复制或生成一个新列表。在

过滤(或列表理解)是一种方法。如果你想就地完成,这样的方法会有效:

purge = []
for i,object in enumerate(self.list):
    if object.mycond()
        purge.append(i)
for i in reversed(purge):
    del self.list[i]

或者,也可以在理解的基础上生成清除列表,快捷方式如下:

^{pr2}$

相关问题 更多 >

    热门问题