dict和collections.defaultdict有什么区别?

时间:2011-07-05 23:02:11

标签: python dictionary

我正在查看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派生的,但是如何决定使用哪一个?

3 个答案:

答案 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'])

摘要

  1. 常规dict中的默认设置是视情况而定,在defaultdict中,我们可以以一般方式提供默认设置

  2. 使用defaultdict默认值的效率是使用普通dict默认值的两倍。您可以参考下面的链接以更好地了解此性能测试 https://shirishweb.wordpress.com/2017/05/06/python-defaultdict-versus-dict-get/