[英]Pythonic way to make sure list exists at dict key before appending
我從這個角度問這個問題,我的印象是要求寬恕而不是許可更像是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)
pythonic方式是你已經發現的后者: defaultdict是一個dict子類,它調用工廠函數來提供缺失值。 它在python 2.5及更高版本中可用。
>>> import collections
>>> d = collections.defaultdict(list)
>>> d[0].append('potato')
>>> d
defaultdict(<type 'list'>, {0: ['potato']})
它正是為了這個目的而存在的,所以盡可能避免使用dict.setdefault
hacks。
如果您擔心速度,可以嘗試對幾種不同的方法進行基准測試。 我嘗試了“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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.