我有这个字典定义:
def train(features):
model = collections.defaultdict(lambda: 1)
for f in features:
model[f] += 1
return model
稍后,我想使用pickle并将字典转储到文本文件中:
f = open('dict.txt', 'wb')
pickle.dump(Nwords, f)
但是代码不起作用,我收到错误。显然pickle
无法与lambda
一起使用,我最好使用模块级函数定义model
。我已经阅读了答案here
不幸的是,由于我对Python没有经验,我不确定如何做到这一点。我试过了:
def dd():
return defaultdict(int)
def train(features):
## model = defaultdict(lambda: 1)
model = defaultdict(dd)
for f in features:
model[f] += 1
return model
我收到错误:
TypeError: unsupported operand type(s) for +=: 'collections.defaultdict' and 'int'
除此之外,return defaultdict(int)
总是会为第一次出现的键分配零,而我希望它分配1.有关如何解决此问题的任何想法?
答案 0 :(得分:2)
不幸的是,那个问题的答案是正确的,但对你来说却是微不足道的。虽然顶层函数而不是lambda很好,但确实会使pickle更快乐,但函数应该返回要使用的默认值,对于你的情况是不另一个{{1}对象。
只需返回defaultdict
返回的相同值:
lambda
每次尝试访问def dd():
return 1
实例中尚不存在的密钥时,都会调用defaultdict
。然后另一篇文章返回另一个 dd
实例,该实例设置为使用defaultdict
作为默认值,与另一个问题中显示的lambda匹配。