KeyError: 0 python与python dict

问题描述 投票:0回答:1

所以我想用python重新创建一个SpaceInvaders游戏。这里是我的外星人的存储位置。

aliens = dict()

每当我们增加游戏等级,就会增加一个新的外星人,以它的ID为键,以它的位置和健康值(每个外星人有2个健康值,在两次射击后死亡,每次造成一个伤害)为值,所以外星人的字典看起来是这样的。

aliens = {
0: [(100, 50), 2],
1: [(50, 200), 1],
etc...
}

现在每当一个异形死亡,我就把它的健康值设置为: -1 并把他的立场设定为 (-100, -100) 把他排除在视野之外,现在问题发生在我调用一个 cleanAlien() 函数,该函数在异形数组中遍历,并弹出每个健康值等于的异形。-1 或一个越界的位置,这里是该函数。

def cleanAliens():
    global aliens
    for i in range(len(aliens)):
        if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
            aliens.pop(i);
            i -= i

但是当我尝试运行这个函数时,我得到了一个错误。

if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
KeyError: 0

有什么办法吗?

先谢谢你了。

python
1个回答
1
投票

我不知道为什么会出现这个错误,但似乎这个结构的 aliens 并不是预期的那样。

然而,你可以在字典的键上迭代,而不是像这样在字典的大小上迭代。

for i in list(aliens.keys()):
    if aliens[i][0] == (-100, -100) or aliens[i][1] < 0:
        aliens.pop(i)

这样你就不会遇到这个键的麻烦。

这个 list(aliens.keys()) 返回字典中的键的副本,这样你就可以遍历它,从字典中删除一个键后,你只需继续下一个键。

(顺便说一下,这个 i -= i 行是没有意义的,因为 i 将根据它的迭代器设置下一次迭代,所以你实际上不能改变它的值)


1
投票

而不是

for i in range(len(aliens)):
    if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
        aliens.pop(i);
        i -= i

你应该用 "理解"。

aliens = { k:v for k,v in aliens.items() if v[0] != (-100,100) and v[1] >= 0 }

在收到 "同样的错误 "的评论后进行测试。

>>> aliens = {
... 0: [(100, 50), 2],
... 1: [(50, 200), 1],
... }
>>> aliens = { k:v for k,v in aliens.items() if v[0] != (-100,100) and v[1] >= 0 }
>>> 

没有错误。


0
投票

EDIT:修复了我的错误,通过创建一个列表,其中附加每个键被删除,然后传递给这个函数。

def Aliens():
    global aliens
    clean = list()
    for i in aliens.keys():
        if(aliens[i][0] == (-100, -100) or aliens[i][1] < 0):
             clean.append(i)
    cleanAliens(clean)

然后传递给这个函数:

def cleanAliens(cleanList):
    global aliens
    for i in range(len(cleanList)):
            aliens.pop(cleanList[i]);
© www.soinside.com 2019 - 2024. All rights reserved.