В чем разница между dict и collection.defaultdict?

Я проверял код Питера Норвига о том, как писать простые проверки орфографии. В начале он использует этот код для вставки слов в словарь.

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

В чем разница между диктофоном Python и тем, который использовался здесь? Кроме того, для чего lambda ? Я проверил здесь документацию API, и он говорит, что defaultdict фактически получен из dict, но как решить, какой из них использовать?

Разница в том, что defaultdict будет «default» значением, если этот ключ еще не установлен. Если вы не использовали defaultdict вам нужно было бы проверить, существует ли этот ключ, а если нет, установите его для того, что вы хотите.

Лямбда определяет завод по умолчанию. Эта функция вызывается всякий раз, когда требуется значение по умолчанию. Вы могли гипотетически иметь более сложную функцию по умолчанию.

 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 принимает функцию как параметр и строит значение с использованием этой функции.

 lambda: 1 

такая же, как беззазорная функция f, которая делает это

 def f(): return 1 

Я забываю, почему API был разработан таким образом, вместо того, чтобы принимать значение в качестве параметра. Если бы я разработал интерфейс defaultdict, это было бы немного сложнее, функция создания отсутствующего значения возьмет недостающий ключ в качестве параметра.