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正在为默认值定义工厂。只要需要默认值,就会调用该函数。你可以假设有一个更复杂的默认函数。
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. | |
(来自
如果缺少某些有意义的默认值并且不想明确处理它们,请使用defaultdict。
defaultdict构造函数将函数作为参数,并使用该函数构造值。
1 | lambda: 1 |
与执行此操作的无参数函数f相同
1 2 | def f(): return 1 |
我忘记了API以这种方式设计的原因,而不是将值作为参数。如果我设计了defaultdict接口,它会稍微复杂一点,缺失值创建函数会将缺少的键作为参数。