В чем разница между dict и collection.defaultdict? - PullRequest
19 голосов
/ 06 июля 2011

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

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

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

Ответы [ 2 ]

27 голосов
/ 06 июля 2011

Разница в том, что defaultdict будет "по умолчанию" значение, если этот ключ еще не был установлен. Если вы не использовали 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 аналогичен по своей природе, но принимает значение вместо заводской функции. Он используется для установки значения, если оно еще не существует ... хотя и немного по-другому.

7 голосов
/ 06 июля 2011

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

Конструктор defaultdict принимает функцию в качестве параметра и создает значение, используя эту функцию.

lambda: 1

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

def f():
 return 1

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...