Arhn - архитектура программирования

TypeError: нехешируемый тип: 'dict' в 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 итеративно.

Трассировка:

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'

значения для mom, 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)]

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

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

31.05.2013

  • Можете ли вы показать полную трассировку? А откуда функция solve? 31.05.2013
  • Я опубликую трассировку, решение из модуля Sympy 31.05.2013
  • @user1987097: обычно полезно опубликовать самостоятельный пример, который люди могут просто скопировать и вставить, чтобы попробовать. Даже после добавления отсутствующего импорта sympy ни mom, ни momvec, ни MFK не определены. 31.05.2013
  • @DSM Это небольшая часть гораздо более крупной программы, но я опубликую значения, которые они должны принять. 31.05.2013
  • sympy.solve возвращает словарь. 31.05.2013
  • @richie Вы знаете, как я могу заставить его вернуть что-то другое? 31.05.2013
  • Перед выполнением MFK[m]= Subs(MFK[m],mm[i], soln[i]).doit() попробуйте напечатать soln[i], чтобы посмотреть, что оно возвращает. 31.05.2013
  • печать soln в цикле дает этот список: [[y_0**2 + ym2], [{x2: (x3 + 2*y_0**3 - ym3)/(3*y_0)}]] Я вижу проблему... 31.05.2013

Ответы:


1

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

02.06.2013

2

Из вашего описания я не могу воспроизвести вашу ошибку. То есть я сделал файл 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. Вы можете исправить такую ​​ошибку с помощью хешируемого замороженного словаря< /а>...

01.06.2013
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..