2017-01-05 7 views
-4
def parameterSchaetzung(kontextfreq,a,p,f1): 
    parameter = defaultdict(lambda: defaultdict(int)) 
    for (s,w) in kontextfreq: 
     parameter[s][w] = (kontextfreq[(s,w)] + a[s] * p[w])/(f1[s] + a[s]) 
     #print((kontextfreq[(s,w)] + a[s] * p[w])/(f1[s] + a[s])) 
    return parameter 

У меня есть ошибка, когда я пытаюсь записать результат функции в мариновании. Я думаю, проблема связана с лямбдой. Как я могу это решить?Как избежать лямбда в Python

>>> parameter = defaultdict(lambda: defaultdict(int)) 
>>> pickle.dump(parameter,open("foo","wb")) 
Traceback (most recent call last): 
    File "<string>", line 301, in runcode 
    File "<interactive input>", line 1, in <module> 
_pickle.PicklingError: Can't pickle <function <lambda> at 0x00000000032DA620>: attribute lookup <lambda> on __main__ failed 
+4

_What_ ошибка ... – RemcoGerlich

+0

Вам нужно воспроизвести ваш отступы точно при публикации кода Python. В противном случае вы вводите новые проблемы в код, который вы просите людей прочитать. – khelwood

+0

Также предоставьте достаточно кода, чтобы мы могли попробовать ваш код для себя ([MCVE] (http://stackoverflow.com/help/mcve)). Может быть, образец вызова метода и вызов рассола в этом случае? – wonderb0lt

ответ

1

lambda характеристика в известной из вашей программы, и вы не можете мариновать функцию.

То, что вы действительно хотите, чтобы мариновать данные, так что просто преобразовать в dict когда демпинг:

pickle.dump(dict(parameter),f) 

и преобразовать обратно при загрузке

parameter = defaultdict(lambda: defaultdict(int)) 
parameter.update(pickle.load(f))