Я делаю домашнее задание по интеллектуальному анализу данных с помощью python (2.7). Я создал словарь веса для всех слов (которые существуют в категории) и для слов, которых нет в этом слове, я хочу назначить значение по умолчанию. Сначала я попробовал использовать setdefault для каждого ключа перед его использованием, он работает отлично, но почему-то мне кажется, что он не выглядит таким питоническим. Поэтому я попытался использовать defaultdict, который большую часть времени работает нормально. Однако иногда он возвращает неверное значение. Сначала я подумал, что это может быть вызвано defaultdict или лямбда-функцией, но, видимо, ошибок нет.
for node in globalTreeRoot.traverse():
...irrelevant...
weight_dict = {.......}
default_value = 1.0 / (totalwords + dictlen)
node.default_value = 1.0/ (totalwords + dictlen)
......
node.weight_dict_ori = weight_dict
node.weight_dict = defaultdict(lambda :default_value,weight_dict)
Итак, когда я пытался напечатать значение, которого не существует во время цикла, оно дает мне правильное значение. Однако после завершения выполнения кода, когда я пытаюсь:
print node.weight_dict["doesnotexist"],
он дает мне неправильное значение, а когда оно неверно, обычно значение, относящееся к другому узлу. Я попытался выполнить поиск в системе именования Python или динамически присвоить значения атрибутам объекта, но не понял.
Кстати, defaultdict быстрее, чем использование setdefault (k, v) каждый раз?