当前位置: 首页 > 面试题库 >

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

隆向晨
2023-03-14
问题内容

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

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

每当有人被螺栓击中时,我都试图降低其健康状况。如果一个外星人的健康状况良好,也应该予以销毁<= 0。同样,螺栓也会被破坏。这是我的代码:

def manage_collide(bolts, aliens):
    # Check if a bolt collides with any alien(s)
    for b in bolts:
        for a in aliens:
            if b['rect'].colliderect(a['rect']):
                for a in aliens:
                    a['health'] -= 1
                    bolts.remove(b)
                    if a['health'] == 0:
                        aliens.remove(a)
    # Return bolts, aliens dictionaries
    return bolts, aliens

ValueError上线情况aliens.remove(a)。为了澄清,aliensbolts都是字典列表。

我究竟做错了什么?


问题答案:

您不应从正在循环的列表中删除项目。而是创建一个副本:

for a in aliens[:]:

for b in bolts[:]:

循环访问列表时修改列表会影响循环:

>>> 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

创建要在循环的 每个 级别上修改的列表的副本时,可以避免出现以下问题:

>>> lst = [1, 2, 3]
>>> for i in lst[:]:
...     for i in lst[:]:
...         print i, lst
...         lst.remove(i)
... 
1 [1, 2, 3]
2 [2, 3]
3 [3]

发生碰撞时,只需要卸下 一次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


 类似资料:
  • 问题内容: Python似乎在创建列表对象和何时创建列表对象之间有所区别。为什么会有这种差异? 虽然第一个表达式似乎按预期工作,但第二个表达式的工作方式更像是迭代dict: 问题答案: 是包含 元素 的列表。 接受(必须已经可以 迭代 !)并将其转换为列表。 列表构造函数-像python的所有内置集合类型(集合,列表,元组,collections.deque等)一样- 可以采用一个可迭代的参数并将

  • 在上下文路径[/VirtualStore]上部署了基于servlet的web应用程序,但上下文未能从下面的日志开始。 这是如何造成的,我该如何解决?

  • 问题内容: 我正在尝试将列表映射为十六进制,然后在其他地方使用该列表。在python 2.6中,这很简单: 答: Python 2.6: 但是,在Python 3.1中,以上代码返回一个map对象。 B: Python 3.1: 如何在Python 3.x上检索映射列表(如上面的A所示)? 另外,还有更好的方法吗?我的初始列表对象大约有45个项目,并且id希望将它们转换为十六进制。 问题答案: 做

  • 问题内容: 我正在尝试将列表映射为十六进制,然后在其他地方使用该列表。在python 2.6中,这很简单: 答: Python 2.6: 但是,在Python 3.1中,以上代码返回一个map对象。 如何在Python 3.x上检索映射列表(如上面的A所示)? 另外,还有更好的方法吗?我的初始列表对象大约有45个项目,并且id喜欢将它们转换为十六进制。 问题答案: 做这个: 在Python 3+中

  • 问题内容: 在contextlib.py,我看到ExitStack类正在呼叫经由类型的对象方法(),而不是直接方法调用给定对象()。 我不知道为什么或为什么不。 例如, 发生错误时,它能否提供更好的异常跟踪? 它只是特定于某些模块作者的编码风格吗? 它对性能有好处吗? 它可以避免一些带有复杂类型层次结构的工件/副作用吗? 问题答案: 首先,这就是您执行操作时发生的事情,而不仅仅是在类型上查找特殊方

  • 问题内容: 阅读的JavaDoc ,我碰到了一个奇怪的方法签名;我一生中从未见过: 乍一看,我想知道通用异常怎么可能发生,因为您不能这样做(here和here)。再三考虑,这开始变得有意义,因为这里只是绑定…,但是供应商本身确切知道泛型之前应该是什么类型。 但是第二行打给我: 是完整的通用异常类型。 然后: 什么世界呢 这 是什么意思? 已绑定在方法签名中。 这将以任何方式解决通用异常限制吗? 为