Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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.
 |  

(from help(type(collections.defaultdict())))

{}.setdefault похож по своей природе, но принимает значение вместо функции factory. Он использовал, чтобы установить значение, если оно еще не существует... но это немного отличается.

Ответ 2

Используйте параметр defaultdict, если у вас есть какое-то значимое значение по умолчанию для отсутствующих ключей и вы не хотите обращаться с ними явно.

Конструктор defaultdict принимает функцию в качестве параметра и строит значение с помощью этой функции.

lambda: 1

совпадает с функцией без параметров f, которая делает это

def f():
 return 1

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