1

我有这本字典定义:

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使用模块级函数。我已经在这里阅读了答案

不幸的是,由于我没有使用 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。关于如何解决这个问题的任何想法?

4

1 回答 1

2

不幸的是,那个答案对那个问题是正确的,但对你来说却是微妙的错误。虽然顶级函数而不是 lambda 很棒并且确实会让 pickle 更快乐,但该函数应该返回要使用的默认值,对于您的情况来说,这不是另一个defaultdict对象。

只需返回与您的lambda回报相同的值:

def dd():
    return 1

每次您尝试访问defaultdict实例中尚不存在的键时,dd都会调用该键。然后另一篇文章返回另一个 defaultdict实例,该实例设置int为默认使用,它与另一个问题中显示的 lambda 匹配。

于 2013-10-31T11:17:14.043 回答