关于python:dict和collections.defaultdict有什么区别?

What is the difference between dict and collections.defaultdict?

我正在查看Peter Norvig关于如何编写简单拼写检查器的代码。 最初,他使用此代码将单词插入字典中。

1
2
3
4
5
def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model

Python dict和这里使用的那个有什么区别? 另外,lambda是什么? 我在这里查看了API文档,它说defaultdict实际上是从dict派生的,但是如何决定使用哪一个呢?


不同之处在于,如果尚未设置该键,defaultdict将"默认"一个值。如果您没有使用defaultdict,则必须检查该密钥是否存在,如果不存在,请将其设置为您想要的密钥。

lambda正在为默认值定义工厂。只要需要默认值,就会调用该函数。你可以假设有一个更复杂的默认函数。

1
2
3
4
5
6
7
8
9
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本质上类似,但是接受值而不是工厂函数。它用于设置值,如果它尚不存在......但这有点不同。


如果缺少某些有意义的默认值并且不想明确处理它们,请使用defaultdict。

defaultdict构造函数将函数作为参数,并使用该函数构造值。

1
lambda: 1

与执行此操作的无参数函数f相同

1
2
def f():
 return 1

我忘记了API以这种方式设计的原因,而不是将值作为参数。如果我设计了defaultdict接口,它会稍微复杂一点,缺失值创建函数会将缺少的键作为参数。