【问题标题】:Python NeuroEvolutionProject: ValueError: list.remove(x): x not in list (when x is, in fact, in the list)Python NeuroEvolutionProject:ValueError:list.remove(x):x不在列表中(当x实际上在列表中时)
【发布时间】:2018-08-16 03:20:17
【问题描述】:

我正在从事一个神经进化项目,其中有一个充满活跃实体和死亡实体的数组。当活动实体死亡时,它们会从活动列表中移除并放入死亡列表中。从活动列表中删除实体时,我经常遇到此错误:ValueError:

ValueError: list.remove(x): x not in list

请注意,这些列表在执行过程中会被填充和清空数百次。此代码在每一帧中运行,因此这些列表在每次执行期间循环数千次。并非每一代都会抛出此错误。它似乎在执行过程中的不同时间点随机发生。

代码示例:

for entity in self.active:
    entity.updatePosition()
    #bla bla bla unimportant...
    if entity.goesOutOfBounds():
        self.dead.append(entity)
        self.active.remove(entity)

如果我可以提供任何其他信息,请询问:)

【问题讨论】:

  • 您是否正在改变您正在迭代的列表?这是导致奇怪的、看似随机的错误的秘诀。
  • @AndrewGuy 是的,我是。我怎样才能解决这个问题?

标签: python-3.x list loops neural-network evolutionary-algorithm


【解决方案1】:

更改您正在迭代的列表是灾难的根源。考虑以下简单情况:

entities = [1,2,3,4,5]
for entity in entities:
    entities.remove(entity)

你会期望每个实体都应该被删除。但是如果你在运行上述代码后查看entities列表:

print(entities)

[2, 4]

显然不是预期的结果。

我将首先重构您的代码,这样您就不会在for entity in self.active 循环中改变self.active。也许存储要删除的项目的临时列表,然后在退出 for entity in self.active: 循环后将它们全部删除:

to_remove = []
for entity in self.active:
    entity.updatePosition()
    #bla bla bla unimportant...
    if entity.goesOutOfBounds():
        to_remove.append(entity)
for entity in to_remove:
    self.active.remove(entity)

或者您可以运行 for entity in self.active[:]: 来创建列表的浅表副本以进行迭代:

for entity in self.active[:]:
    entity.updatePosition()
    #bla bla bla unimportant...
    if entity.goesOutOfBounds():
        self.dead.append(entity)
        self.active.remove(entity)

您可能应该分析这些不同的选项,看看哪个更适合您的情况。

从提供的代码中,我无法确切了解您的错误是如何产生的。但是有很多您没有提供的代码可能会有所贡献(即#bla bla bla unimportant)。我怀疑您的问题可能在于我上面概述的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2022-01-12
    • 2018-07-05
    • 2014-08-14
    • 2013-10-29
    相关资源
    最近更新 更多