Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
KeyError:0使用python dict的python_Python - Fatal编程技术网

KeyError:0使用python dict的python

KeyError:0使用python dict的python,python,Python,所以我正试图用python重新创建一个spaceInvaders游戏。这里是我的外星人的存放地: aliens = dict() 每增加一次游戏等级,就会增加一个新的外星生物,它的id是一把钥匙,他的位置和生命值(每个外星生物有2点生命值,在两次射击后死亡,每次造成一点伤害)是他的值,所以外星生物字典可以如下所示: aliens = { 0: [(100, 50), 2], 1: [(50, 200), 1], etc... } 现在,每次外星人死亡时,我都会将其健康设置为-1,并将其位置设

所以我正试图用python重新创建一个spaceInvaders游戏。这里是我的外星人的存放地:

aliens = dict()
每增加一次游戏等级,就会增加一个新的外星生物,它的id是一把钥匙,他的位置和生命值(每个外星生物有2点生命值,在两次射击后死亡,每次造成一点伤害)是他的值,所以外星生物字典可以如下所示:

aliens = {
0: [(100, 50), 2],
1: [(50, 200), 1],
etc...
}
现在,每次外星人死亡时,我都会将其健康设置为
-1
,并将其位置设置为
(-100,-100)
,以将其排除在视野之外,现在,当我调用
cleanAlien()时会出现问题
函数,该函数遍历alien数组,并弹出每个运行状况等于
-1
或越界位置的alien,以下是该函数:

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
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 cleanExistes():
全球外星人
对于范围内的i(len(外星人)):
如果(外星人[i][0]==(-100,-100)或外星人[i][1]<0):
外星人,流行音乐(一);
i-=i
但是,当我尝试运行时,我得到一个错误:

if(外星人[i][0]==(-100,-100)或外星人[i][1]<0):
关键错误:0
有什么想法吗


提前感谢。

我不确定这一特定错误的原因,但似乎外星人的结构并不像预期的那样

但是,您可以遍历字典的键,而不是遍历字典的大小,如下所示:

for i in list(aliens.keys()):
    if aliens[i][0] == (-100, -100) or aliens[i][1] < 0:
        aliens.pop(i)
列表中i的
(existes.keys()):
如果外星人[i][0]==(-100,-100)或外星人[i][1]<0:
外星人,流行音乐(一)
这样你就不会陷入这个关键的麻烦

列表(existes.keys())
返回字典中键的副本,因此您可以对其进行迭代,从字典中删除一个键后,只需继续下一个键即可

(顺便说一句,
i-=i
行没有意义,因为
i
将根据其迭代器在下一次迭代中设置,因此您不能实际更改其值)

而不是:

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

更新:收到关于“相同错误”的评论后进行测试:

没有错误。

编辑: 通过创建一个列表修复了我的错误,该列表附加了每个要删除的键,然后传递给此函数:

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

在循环的每次迭代中添加
打印(外星人)
,并确保循环中有一个key=0dict@Meccano这是引发错误之前的最后一个输出:
{1:[(540,103),2],2:[(218,110),2]}
为什么在循环结束时执行
i-=i
?为什么您选择以这种不典型的方式编写
i=0
?@Daweo我这样做是因为当我弹出一个元素时,字典的长度会缩短,但是,即使没有
i-=1
它也会给我带来相同的错误。请回答您的问题并提供答案。感谢您的回答,但这在我的情况下不起作用,并会引发相同的错误谢谢您的有用回答,给我带来了其他错误,但是我现在得到了:
for i in alien.keys():RuntimeError:dictionary在迭代期间在代码中的同一位置更改了大小
?我已经在一个虚拟字典上测试了这个方法,它似乎是有效的。
def cleanAliens(cleanList):
    global aliens
    for i in range(len(cleanList)):
            aliens.pop(cleanList[i]);