2013-02-20 21 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) 
相关问题