2013-05-31 62 views
0

我收到約字典的錯誤消息,儘管從來沒有使用過一本字典在我的代碼類型錯誤:unhashable類型:「快譯通」在Python

這裏的任何地方是我的代碼:

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的內容。

回溯:用於分別媽媽,momvec和MFK

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' 

值:

[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導入後,也不會定義「媽媽」,「媽媽」和「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) 

沒有任何錯誤或回溯。

但是,如果確實在隱藏字典出現的代碼中找到了點,則原因字典不應該是可散列的(因此可用作其他字典中的鍵)是因爲它們是可變的。如果你使用一個作爲關鍵字,然後在其結構的某個深處更改某個值,則可能會出現奇怪的x != x樣式錯誤。你能解決這樣的錯誤了hashable frozen dictionary ......

相關問題