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