Python抛出ValueError:list.remove(x):x不在列表中

Python抛出ValueError:list.remove(x):x不在列表中,python,Python,每次运行此程序时,都会出现以下错误: ValueError: list.remove(x): x not in list 每当一个外星人被闪电击中时,我试图降低它的健康水平。如果一个外星人的健康状况是,那么它也应该被销毁。你不应该从循环列表中删除项目。改为创建副本: for a in aliens[:]: 及 在列表上循环时修改列表会影响循环: >>> lst = [1, 2, 3] >>> for i in lst: ... print i ..

每次运行此程序时,都会出现以下错误:

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

每当一个外星人被闪电击中时,我试图降低它的健康水平。如果一个外星人的健康状况是
,那么它也应该被销毁。你不应该从循环列表中删除项目。改为创建副本:

for a in aliens[:]:

在列表上循环时修改列表会影响循环:

>>> lst = [1, 2, 3]
>>> for i in lst:
...     print i
...     lst.remove(i)
... 
1
3
>>> lst
[2]
从循环两次的列表中删除项目会使事情变得更加复杂,从而导致ValueError:

>>> lst = [1, 2, 3]
>>> for i in lst:
...     for a in lst:
...         print i, a, lst
...         lst.remove(i)
... 
1 1 [1, 2, 3]
1 3 [2, 3]
Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
ValueError: list.remove(x): x not in list
当你发生碰撞时,你只需要拆下
b
螺栓一次,而不是在你伤害外星人的环中。稍后单独清理外星人:

def manage_collide(bolts, aliens):
    for b in bolts[:]:
        for a in aliens:
            if b['rect'].colliderect(a['rect']) and a['health'] > 0:
                bolts.remove(b)
                for a in aliens:
                    a['health'] -= 1
    for a in aliens[:]:
        if a['health'] <= 0:
            aliens.remove(a)
    return bolts, aliens
def管理_碰撞(螺栓、异形):
对于螺栓[:]中的b:
对于外国人:
如果b['rect'].collizeRect(a['rect'])和a['health']>0:
螺栓。拆卸(b)
对于外国人:
a[“健康”]-=1
对于《外星人》[:]:

如果['health']代码中存在导致此问题的bug。简化后的代码如下所示:

for b in bolts:
  for a in aliens:
    for a in aliens:
      bolts.remove(b)
这会导致您对
b
中的每个条目循环多次。如果在
外星人
上的第一个循环中删除了b,那么当它再次在其上循环时,将出现错误

有几件事需要解决。首先,将
外星人
的内部循环更改为使用
a
以外的内容,因此:

for b in bolts:
  for a in aliens:
    for c in aliens:
      if hit:
        bolts.remove(b)
第二,仅从
螺栓上拆下
b
一次。因此:

for b in bolts:
  for a in aliens:
    should_remove = False
    for c in aliens:
      if hit:
        should_remove = True
    if should_remove:
      bolts.remove(b)
我认为,这段代码也存在其他问题,但这是导致您的主要问题的原因。Martijn的帖子也可能会有所帮助。

也给螺栓一个“健康”值,初始化为1。然后你可以做一个嵌套的循环来计算所有的伤害,还有两个独立的未列出的“循环”来移除所有“死亡”的东西。除此之外,不要这样做,因为您仍然不想修改正在循环的列表。复制仍然太复杂。您真正想要做的是直接构建一个新的列表,其中只包含仍然“活动”的内容,您可以使用列表理解(或者如图所示,使用
过滤器
)进行描述


我认为,若您将for循环替换为while循环—仅在从列表中删除的循环中—将解决此问题

像这样

lis = [1,2,3,4,5,6]
i=0
while i in range(len(lis)) :
    lis. remove(lis[i])

您不能使用list.remove 您应该使用del list[x]

因为在使用“删除”时,必须按名称而不是索引命名已删除的项目,所以在操作代码时会出现此错误(值错误:x不在列表中) 但当我们使用del时,它是可以的,因为我们通过它的索引删除了项。 无论项目名称是什么,使用del,代码都将正确运行 我希望我解决了这个问题并解决了它

我想知道我的确切意思 请尝试此代码 然后用remove重新绘制del,你就会明白我的意思了。 代码如下:

aliens = [[4,3,2,1],[4,3,2,1],[4,3,2,1]]
print(aliens)
bolts = [b for b in range(1,30)]
for b in bolts:
    del aliens[0][0]
    print(aliens) 
        if len(aliens[0]) == 0:
            del aliens[0]
    if len(aliens) == 0
                print("you win")
        break

ValueError在哪一行?为了将来参考,此代码的问题是我在外星人列表上循环了两次,这在尝试从列表中删除时会导致一些问题。删除第二个“外星人中的a”可以防止这个问题。这实际上并不能回答OP的问题。在遍历列表时从列表中删除项目实际上不是问题;只是如果您不知道它是如何工作的,它可能会产生意外的结果。它仍然会在同一行上放置ValueError。如果仅将该行更改为副本列表,请删除(a)。@kindall:正是双循环让它变得更加有趣,并可能导致值错误。这对我来说仍然不起作用。也许你可以直接修改我的代码?虽然这段代码可以解决这个问题,但如何以及为什么解决这个问题将真正有助于提高你的文章质量,并可能导致更多的投票。请记住,你是在将来回答读者的问题,而不仅仅是现在提问的人。请在回答中添加解释,并说明适用的限制和假设。
for b in bolts:
  for a in aliens:
    should_remove = False
    for c in aliens:
      if hit:
        should_remove = True
    if should_remove:
      bolts.remove(b)
# for example
class Alien:
    # ... other stuff
    def damage(self): self.hp -= 1
    def alive(self): return self.hp > 0

# similarly for Bolt

def collide(an_alien, a_bolt):
    # etc.

def handle_collisions(aliens, bolts):
    for a in aliens:
        for b in bolts:
            if collide(a, b):
                a.damage()
                b.damage()

    return list(filter(Alien.alive, aliens)), list(filter(Bolt.alive, bolts))
lis = [1,2,3,4,5,6]
i=0
while i in range(len(lis)) :
    lis. remove(lis[i])
aliens = [[4,3,2,1],[4,3,2,1],[4,3,2,1]]
print(aliens)
bolts = [b for b in range(1,30)]
for b in bolts:
    del aliens[0][0]
    print(aliens) 
        if len(aliens[0]) == 0:
            del aliens[0]
    if len(aliens) == 0
                print("you win")
        break