3

我是从这样的角度提出这个问题的,即我的印象是请求宽恕而不是许可更像是 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)
4

2 回答 2

1

pythonic 方式是您已经发现的后者:defaultdict是一个 dict 子类,它调用工厂函数来提供缺失值。它在 python 2.5 及更高版本中可用。

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

它的存在正是为了这个目的,所以dict.setdefault尽可能避免黑客攻击。

于 2013-02-20T02:48:40.470 回答
0

如果您担心速度,可以尝试对几种不同的方法进行基准测试。我尝试了“if key in dictionary”方法,发现 try/except 平均要快 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)
于 2013-02-20T03:47:17.673 回答