x是一個元組:(X1,X2)嘗試 - 除了在Python KeyError異常塊
try:
clusters[bestmukey].append(x) # statment 1
except KeyError:
clusters[bestmukey] = [x] # statement 2
(1)如何語句1和語句2做不同的事情?
(2)爲什麼需要分離的語句?
x是一個元組:(X1,X2)嘗試 - 除了在Python KeyError異常塊
try:
clusters[bestmukey].append(x) # statment 1
except KeyError:
clusters[bestmukey] = [x] # statement 2
(1)如何語句1和語句2做不同的事情?
(2)爲什麼需要分離的語句?
clusters[bestmukey].append(x)
要求clusters[bestmukey]
已經存在,並且是一個可以附加到的列表。如果clusters
沒有正確的密鑰,則會引發KeyError。
clusters[bestmukey] = [x]
將始終工作(只要clusters
是一個字典,這是我所假設的),並將該值設置爲一個元素的新列表。
如果密鑰不存在,代碼的作用是創建一個帶有新單值的列表,或者如果該值已經存在,則將該值添加到現有列表中。
沒有嘗試/除了使用defaultdict
可以實現相同的效果。 defaultdict有效地將此邏輯包裝到自身中。
那麼清楚!謝謝! – 2014-10-06 00:58:37
顯然clusters
是一個dict
其值是列表。如果密鑰bestmukey
存在,此代碼會嘗試附加到這樣的列表,但如果不存在,則會添加密鑰並啓動列表。
這通常會是最好使用defaultdict
clusters[bestmukey] = ...
在聲明#2會寫信給clusters[bestmukey]
,不管是什麼(它被稱爲左值,左值,是你分配到)。但是,語句#1中的clusters[bestmukey]
是一個右值(不是您指定的值),並且在Python的頭腦中它需要存在,否則會出錯。即使你沒有得到一個錯誤(就像在Ruby或其他語言中一樣),你不會得到一些你可以在append
上得到的東西,所以語句#1不適用。
*)您可以用defaultdict
。但這是另一回事。
假設'clusters'是一個字典,語句1將一個元素添加到作爲列表的'value'中,如果key,value對沒有被初始化,將會引發'key error';因此,陳述2創建了一個新的關鍵值對。 – Akavall 2014-10-06 00:35:44
'dict.setdefault'如果沒有'try/except' – 2014-10-06 00:40:17