2014-10-06 93 views
0

x是一個元組:(X1,X2)嘗試 - 除了在Python KeyError異常塊

try: 
    clusters[bestmukey].append(x) # statment 1 
except KeyError: 
    clusters[bestmukey] = [x]  # statement 2 

(1)如何語句1和語句2做不同的事情?

(2)爲什麼需要分離的語句?

+0

假設'clusters'是一個字典,語句1將一個元素添加到作爲列表的'value'中,如果key,value對沒有被初始化,將會引發'key error';因此,陳述2創建了一個新的關鍵值對。 – Akavall 2014-10-06 00:35:44

+0

'dict.setdefault'如果沒有'try/except' – 2014-10-06 00:40:17

回答

3

clusters[bestmukey].append(x)要求clusters[bestmukey]已經存在,並且是一個可以附加到的列表。如果clusters沒有正確的密鑰,則會引發KeyError。

clusters[bestmukey] = [x]將始終工作(只要clusters是一個字典,這是我所假設的),並將該值設置爲一個元素的新列表。

如果密鑰不存在,代碼的作用是創建一個帶有新單值的列表,或者如果該值已經存在,則將該值添加到現有列表中。

沒有嘗試/除了使用defaultdict可以實現相同的效果。 defaultdict有效地將此邏輯包裝到自身中。

+0

那麼清楚!謝謝! – 2014-10-06 00:58:37

0

顯然clusters是一個dict其值是列表。如果密鑰bestmukey存在,此代碼會嘗試附加到這樣的列表,但如果不存在,則會添加密鑰並啓動列表。

這通常會是最好使用defaultdict

0

clusters[bestmukey] = ...在聲明#2會寫信給clusters[bestmukey],不管是什麼(它被稱爲左值,左值,是你分配到)。但是,語句#1中的clusters[bestmukey]是一個右值(不是您指定的值),並且在Python的頭腦中它需要存在,否則會出錯。即使你沒有得到一個錯誤(就像在Ruby或其他語言中一樣),你不會得到一些你可以在append上得到的東西,所以語句#1不適用。


*)您可以用defaultdict。但這是另一回事。