簡體   English   中英

KeyError: 0 python 與 python 字典

[英]KeyError: 0 python with python dict

所以我正在嘗試用 python 重新創建一個 spaceInvaders 游戲。 這里是存放我的外星人的地方:

aliens = dict()

每次我們提高游戲級別時,都會添加一個新的外星人,它的 id 作為鍵,他的位置和生命值(每個外星人有 2 生命值,在兩次射擊后死亡,每次造成一次傷害)作為他的值,所以外星人字典看起來像這樣:

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

現在每次外星人死亡時,我將其生命值設置為-1並將他的位置設置為(-100, -100)以將他排除在視野之外,現在當我調用cleanAlien() function 迭代外星人時,就會出現問題數組並彈出所有生命值等於-1或超出范圍 position 的外星人,這是 function:

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

有任何想法嗎?

提前致謝。

我不確定這個特定錯誤的原因,但似乎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將根據其迭代器設置下一次迭代,因此您實際上無法更改其值)

代替:

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

沒有錯誤。

編輯:通過創建一個列表來修復我的錯誤,該列表附加了每個要刪除的鍵,然后傳遞給這個 function:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM