2012-10-12 115 views
0

我有一個while循環:檢查無效的密鑰

while parent != None: 
    pathList.append(parentMap[parent]) 
    parent = parentMap[parent] 

我想這個列表做的僅僅是添加父值父值的(在代碼的其他部分已經確定)直到我到達樹的頂端,並且沒有剩下的父母。 while循環的操作思想是一旦parentMap [parent]提供了一個無效的[parent]鍵,它將被賦值爲「None」,循環將終止。這不會發生。相反,一旦我到達最頂端的鍵(5,5),程序就會拋出一個錯誤,指出「無效鍵」。思考?

回答

1

的問題,正如其他人也指出,在這樣一個事實:dict不一樣,如果一鍵返回None找不到,但反而會引起KeyError例外(as seen in the documentation)。

要解決這個問題,您可以使用defaultdictcollections,並將None設置爲該字典的默認值。我建議你閱讀classes documentation

在這種情況下,而不是你的初始化作爲dictparentMap = dict(some_initializer)parentMap = {}可以使用parentMap = defaultdict(lambda: None, some_initializer)parentMap = defaultdict(lambda: None, {})和丟失的鑰匙將返回None,而不是提高KeyError例外。

在一個不相關的問題中,None是一個單身人士,最好檢查一下item is not None而不是!=。根據我的愚見,它生成更清晰的代碼。

1

那麼你得到一個錯誤,說明invalid key的原因是因爲你可能沒有把頂級父母的parentMap[parent]分配給None,你只是沒有把它放在地圖上。由於它不在地圖中,因此默認行爲是拋出invalid key錯誤。

這就是你在做什麼?

編輯:要解決,使用parentMap.get(parent, None)

+0

是(我認爲這不會引發錯誤,但根本沒有分配的值) ,但我不知道如何改善這種情況。如果我初始化最上面的值的父項爲None,那麼它會嘗試將None映射到列表中,並且事情再次變得不合時宜了...... – user1427661

+0

Joran或John的方法都可以解決它。我個人會和約翰一起去的,因爲我被教導說避免嘗試/除非是好的做法,但是兩者都應該工作。 – Colleen

+0

另外請注意,約翰的解決方案使用'不是None'而不是'!= None',這也是更好的風格。 – Colleen

2
while parent != None: 
     try: 
      pathList.append(parentMap[parent]) 
      parent = parentMap[parent] 
     except KeyError: 
      parent = None 

應該正常工作

4

可以使用get方法返回一個默認值,如果該鍵沒有在地圖上找到:

while parent is not None: 
    pathList.append(parentMap[parent]) 
    parent = parentMap.get(parent, None) # returns None if key is not found