TypeError:不可用类型:python中的'dict'

时间:2013-05-31 14:25:16

标签: python dictionary sympy

我收到了关于字典的错误消息,尽管我从未在代码中的任何地方使用字典

这是我的代码:

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'
妈妈,妈妈和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)]

将输出打印到屏幕看起来好像第一个循环正常,然后它会在标题中抛出错误。有谁知道我怎么解决这个问题?

非常感谢

2 个答案:

答案 0 :(得分: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 ...

修复此类错误

答案 1 :(得分:1)

您的soln[i]是一个字典,但它必须是一个SymPy表达式(您打算将MFK[m]替换为mm[i])。