2013-05-31 4 views
0

я получаю сообщение об ошибке словарях, несмотря никогда не использовался словаря нигде в моем кодеTypeError: unhashable типа: «DICT» в питоне

Вот мой код:

mm=[] 
soln=[] 
for i in range(len(momvec)): 
    string = str(momvec[i]) 
    num = string[2:] 
    mm.append(Symbol('x'+num)) 
    print num 
    print mm 
    soln.append(solve(mom[i]-momvec[i],mm)) 
print type(MFK[0]) 
for m in range(0,len(MFK)): 
    for i in range(0,len(mm)): 
     print MFK[m] 
     MFK[m]= Subs(MFK[m],mm[i], soln[i]).doit() 

Я Я пытаюсь сделать это, заменив некоторые элементы в списке MFK с тем, что указано mm с содержанием soln итеративно.

отслеживающий:

Traceback (most recent call last): 
    File "MEA.py", line 313, in <module> 
    MFK_final(numMoments) 
    File "MEA.py", line 242, in MFK_final 
    MFK[m]= Subs(MFK[m],mm[i], soln[i]).doit() 
    File "/cluster/soft/linux64/epd/lib/python2.7/site-packages/sympy/core/function.py", line 1270, in __new__ 
    pts = sorted(set(point), key=default_sort_key) 
TypeError: unhashable type: 'dict' 

значения для мамы, momvec и MFK соответственно:

[x2 - y_0**2] 

[ym2] 

[-2*c_0*y_0*(y_0 - 1) - 2*c_0*(-y_0**2 + yx1*(y_0**2/yx1 + 1)) + 2*c_1*(0.5*c_2 - 0.5*y_0), 4.0*c_0*y_0**2 - 4.0*c_0*y_0 + 2.0*c_1*c_2 - 2.0*c_1*y_0 - (-y_0**2 + yx1*(y_0**2/yx1 + 1))*(8.0*c_0*y_0 - 8.0*c_0 + 2.0*c_1)] 

печати Вывод на экран появляется, как будто первый цикл проходит нормально, то он выдает ошибку в название. Кто-нибудь знает, как я могу это решить?

Большое спасибо

+3

Можете ли вы показать полную трассу? И откуда происходит функция 'solve'? –

+0

Я отправлю трассировку, решаясь из модуля Sympy – user124123

+4

@ user1987097: обычно полезно опубликовать [автономный пример] (http://sscce.org), который люди могут просто скопировать и вставить, чтобы попробовать вне. Даже после добавления отсутствующих импортов sympy не определены ни 'mom', ни' momvec', ни 'MFK'. – DSM

ответ

1

Вашего soln[i] является словарем, но это должно быть выражение SymPy (тот, который вы планируете заменить в MFK[m] для mm[i]).

1

Из вашего описания, я не могу воспроизвести вашу ошибку. То есть, я сделал файл Python:

from sympy import * 

x2 = Symbol("x2") 
y_0 = Symbol("y_0") 
ym2 = Symbol("ym2") 
c_0 = Symbol("c_0") 
c_1 = Symbol("c_1") 
c_2 = Symbol("c_2") 
yx1 = Symbol("yx1") 

mom = [x2 - y_0**2] 
momvec = [ym2] 
MFK = [-2*c_0*y_0*(y_0 - 1) - 2*c_0*(-y_0**2 + yx1*(y_0**2/yx1 + 1)) + 2*c_1*(0.5*c_2 - 0.5*y_0), 4.0*c_0*y_0**2 - 4.0*c_0*y_0 + 2.0*c_1*c_2 - 2.0*c_1*y_0 - (-y_0**2 + yx1*(y_0**2/yx1 + 1))*(8.0*c_0*y_0 - 8.0*c_0 + 2.0*c_1)] 

mm=[] 
soln=[] 
for i in range(len(momvec)): 
    string = str(momvec[i]) 
    num = string[2:] 
    mm.append(Symbol('x'+num)) 
    print num 
    print mm 
    soln.append(solve(mom[i]-momvec[i],mm)) 
print type(MFK[0]) 
for m in range(0,len(MFK)): 
    for i in range(0,len(mm)): 
     print MFK[m] 
     MFK[m]= Subs(MFK[m],mm[i], soln[i]).doit() 

и он просто выводит

2 
[x2] 
<class 'sympy.core.add.Add'> 
-2*c_0*y_0*(y_0 - 1) - 2*c_0*(-y_0**2 + yx1*(y_0**2/yx1 + 1)) + 2*c_1*(0.5*c_2 - 0.5*y_0) 
4.0*c_0*y_0**2 - 4.0*c_0*y_0 + 2.0*c_1*c_2 - 2.0*c_1*y_0 - (-y_0**2 + yx1*(y_0**2/yx1 + 1))*(8.0*c_0*y_0 - 8.0*c_0 + 2.0*c_1) 

без каких-либо ошибок или tracebacks.

Однако, если вы находите точку в коде, где отображается скрытый словарь, словари причины не должны быть хешируемыми (и поэтому их можно использовать в качестве ключей в других словарях), так как они изменяемы. Если вы используете один в качестве ключа, а затем измените значение где-то глубоко в своей структуре, вы можете получить странные ошибки стиля x != x. Вы можете исправить такую ​​ошибку с hashable frozen dictionary ...

Смежные вопросы