腌制使用defaultdict的字典

时间:2013-10-31 11:14:05

标签: python dictionary pickle

我有这个字典定义:

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.有关如何解决此问题的任何想法?

1 个答案:

答案 0 :(得分:2)

不幸的是,那个问题的答案是正确的,但对你来说却是微不足道的。虽然顶层函数而不是lambda很好,但确实会使pickle更快乐,但函数应该返回要使用的默认值,对于你的情况是另一个{{1}对象。

只需返回defaultdict返回的相同值:

lambda

每次尝试访问def dd(): return 1 实例中尚不存在的密钥时,都会调用defaultdict。然后另一篇文章返回另一个 dd实例,该实例设置为使用defaultdict作为默认值,与另一个问题中显示的lambda匹配。