簡體   English   中英

Pythonic方法確保列表在附加之前存在於dict鍵

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM