我正在查看Peter Norvig的code关于如何编写简单的拼写检查器的问题。最初,他使用此代码将单词插入字典中。
def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
model[f] += 1
return model
Python dict与此处使用的dict有什么区别?另外,lambda
是什么?我检查了API文档here,它说defaultdict实际上是从dict派生的,但是如何决定使用哪一个?
答案 0 :(得分:26)
不同之处在于,如果尚未设置该密钥,defaultdict
将“默认”一个值。如果您没有使用defaultdict
,则必须检查该密钥是否存在,如果不存在,请将其设置为您想要的密钥。
lambda正在为默认值定义工厂。只要需要默认值,就会调用该函数。你可以假设有一个更复杂的默认函数。
Help on class defaultdict in module collections:
class defaultdict(__builtin__.dict)
| defaultdict(default_factory) --> dict with default factory
|
| The default factory is called without arguments to produce
| a new value when a key is not present, in __getitem__ only.
| A defaultdict compares equal to a dict with the same items.
|
(来自help(type(collections.defaultdict()))
)
{}.setdefault
在性质上类似,但是接受值而不是工厂函数。它用于设置值,如果它尚不存在......但这有点不同。
答案 1 :(得分:7)
如果缺少一些有意义的默认值并且不想明确处理它们,请使用defaultdict。
defaultdict构造函数将函数作为参数,并使用该函数构造一个值。
lambda: 1
与执行此操作的无参数函数f相同
def f():
return 1
我忘记了API以这种方式设计的原因,而不是将值作为参数。如果我设计了defaultdict接口,它会稍微复杂一点,缺失值创建函数会将缺少的键作为参数。
答案 2 :(得分:4)
礼貌:-https://shirishweb.wordpress.com/2017/05/06/python-defaultdict-versus-dict-get/
使用普通词典
d={}
d['Apple']=50
d['Orange']=20
print(d['Apple'])
print(d['Grapes'])# This gives Key Error
我们也可以通过在常规dict中使用默认设置来避免此KeyError,让我们看看如何做到这一点
d={}
d['Apple']=50
d['Orange']=20
print(d['Apple'])
print(d.get('Apple'))
print(d.get('Grapes',0)) # DEFAULTING
使用默认字典
from collections import defaultdict
d = defaultdict(int) ## inside parenthesis we say what should be the default value.
d['Apple']=50
d['Orange']=20
print(d['Apple'])
print(d['Grapes']) ##→ This gives Will not give error
使用用户定义的函数来默认值
from collections import defaultdict
def mydefault():
return 0
d = defaultdict(mydefault)
d['Apple']=50
d['Orange']=20
print(d['Apple'])
print(d['Grapes'])
摘要
常规dict中的默认设置是视情况而定,在defaultdict中,我们可以以一般方式提供默认设置
使用defaultdict默认值的效率是使用普通dict默认值的两倍。您可以参考下面的链接以更好地了解此性能测试 https://shirishweb.wordpress.com/2017/05/06/python-defaultdict-versus-dict-get/