2013-02-20 48 views
3

我從這個角度問我這樣的觀點,我的印象是,它是比請求寬恕更Pythonic。Pythonic的方式,以確保列表存在於字典密鑰之前追加

所以,我有一些代碼,就像:

d = dict() 
try: 
    d[est['state']].append(est) 
except Exception: 
    d[est['state']] = [] 
    d[est['state']].append(est) 

在上面的代碼中,我在重複自己,這是相當跛腳的費用請求原諒,而不是許可!所以,我不知道,我寧願:

d = dict() 
if est['state'] in d: 
    d[est['state']].append(est) 
else: 
    d[est['state']] = [est] 

這兩種方法都是粗糙的。有什麼更好的方法來做到這一點?最好的我發現迄今:

from collections import defaultdict 
d = defaultdict(list) 
d[est['state']].append(est) 
+3

是啊,用'defaultdict'或'dict.setdefault'如果你沒有做2.5。我認爲你已經回答了你自己的問題:) – 2013-02-20 01:57:56

+1

'defaultdict'太棒了。現在,如果只有'defaultOrderedDict'在stdlib中... – nneonneo 2013-02-20 01:59:54

+0

完全錯過了'dict.setdefault'。看起來它與'dict.get'類似,但除了返回鍵值之外,還會設置默認值。野生! – 2013-02-20 02:02:14

回答

1

的Python的方式是你已經發現了後者:defaultdict是一個字典子類調用一個工廠函數來提供缺少的值。它在python 2.5及更高版本中可用。

>>> import collections 
>>> d = collections.defaultdict(list) 
>>> d[0].append('potato') 
>>> d 
defaultdict(<type 'list'>, {0: ['potato']}) 

它存在正是爲此目的,所以要避免dict.setdefault黑客如果可能的話。

+0

+1回答:D – 2013-02-20 03:35:14

0

如果您擔心速度問題,您可以嘗試使用幾種不同的方法進行基準測試。我已經嘗試過「如果字典中的鍵」的方法,並發現嘗試/除了平均快10%左右。我發現,在這類問題中,我的Python最佳實踐每隔幾年就會改變一次。如果您需要與Python 2.4兼容,此答案可能會有所幫助。使用

你的榜樣,我會:

d = {} 

# Confirm separately that est['state'] does not raise a KeyError. 

state = est['state'] 

try: 
    l = d[state] 
except KeyError: 
    l = [] 
    d[state] = l 

l.append(est) 
相關問題