我如何评估 sympy 字典中的字符串

如何解决我如何评估 sympy 字典中的字符串

嗨,对于这段代码,有没有办法评估 sol 字典中的答案而不是一长串数学方程?当我尝试通过字典键 sol[i][x] 访问答案时。它只是给我 x 的关键错误。因此,我无法以这种方式对其进行评估。有没有其他方法可以解决这个问题?

这是错误: 密钥错误错误:'x'

这是我的确切代码

    @app.route('/simult',methods = ['GET',"POST"])
def simult():
  sign1 = ""
  sign2 = ""
  if os.path.exists("data.json"):
        with open("data.json") as datafile:
            saveddata = json.load(datafile)
  if request.method == "POST":
    saveddata["x1"] = request.form["x1"]
    saveddata["y1"] = request.form["y1"]
    saveddata["x2"] = request.form["x2"]
    saveddata["y2"] = request.form["y2"]
    saveddata["px1"] = request.form["px1"]
    saveddata["py1"] = request.form["py1"]
    saveddata["px2"] = request.form["px2"]
    saveddata["py2"] = request.form["py2"]
    saveddata["sign1"] = request.form["sign1"]
    saveddata["sign2"] = request.form["sign2"]
    saveddata["ans1"] = request.form["ans1"]
    saveddata["ans2"] = request.form["ans2"]
    if saveddata["sign1"] == "":
        sign1 = ""
    if saveddata["sign1"] == "+":
        sign1 = '+'
    if saveddata["sign1"] == "-":
        sign1 = '-'
    if saveddata["sign1"] == "x":
        sign1 = '*'
    if saveddata["sign1"] == "^":
        sign1 = "**"
    if saveddata["sign1"] == "/":
        sign1 = "/"
    if saveddata["sign2"] == "":
        sign2 = ""
    if saveddata["sign2"] == "+":
        sign2 = '+'
    if saveddata["sign2"] == "-":
        sign2 = '-'
    if saveddata["sign2"] == "x":
        sign2 = '*'
    if saveddata["sign2"] == "^":
        sign2 = "**"
    if saveddata["sign2"] == "/":
        sign2 = "/"
    saveddata["sign1"] = sign1
    saveddata["sign2"] = sign2
  with open("data.json","w") as datafile:
        json.dump(saveddata,datafile)
  return render_template("Simaltaenous.html")

@app.route("/res",methods=['GET','POST'])
def res():
    if os.path.exists("data.json"):
        with open("data.json") as datafile:
            saveddata = json.load(datafile)
    final_lst = []
    final1 = str(saveddata["x1"]) + "x**" + str(saveddata["px1"]) + " " + str(saveddata["sign1"]) + " " + str(saveddata["y1"]) + "y**" + str(saveddata["py1"]) + " = " + str(saveddata["ans1"])
    final2 = str(saveddata["x2"]) + "x**" + str(saveddata["px2"]) + " " + str(saveddata["sign2"]) + " " + str(saveddata["y2"]) + "y**" + str(saveddata["py2"]) + " = " + str(saveddata["ans2"])
    final_lst.append(final1)
    final_lst.append(final2)
    x,y = symbols('x,y')
    transformations=(standard_transformations + (implicit_multiplication_application,))
    eqs_sympy = [Eq(parse_expr(e.split('=')[0],transformations=transformations),parse_expr(e.split('=')[1],transformations=transformations)) for e in final_lst]
    sol = solve(eqs_sympy,dict = True)
    final_ans = []
    final_dct = {}
    for i in range(len(sol)):
        ansx = eval(str(sol[i]['x']))
        ansy = eval(str(sol[i]['y']))
        final_dct["x"] = ansx
        final_dct["y"] = ansy
        final_ans.append(final_dct)
        final_dct = {}
    return render_template("res.html",sol = final_ans)

解决方法

使用您的原始代码:

In [45]: from sympy.parsing.sympy_parser import parse_expr,standard_transformations,implicit_multiplication_application
    ...: 

In [46]: eqs = ['2w + x + 4y + 3z = 5',...:        'w - 2x + 3z = 3',...:        '3w + 2x - y + z = -1',...:        '4x - 5z = -3']
    ...: transformations=(standard_transformations + (implicit_multiplication_ap
    ...: plication,))
    ...: eqs_sympy = [Eq(parse_expr(e.split('=')[0],transformations=transformat
    ...: ions),...:                 parse_expr(e.split('=')[1],transformations=transformat
    ...: ions))
    ...:              for e in eqs]
    ...: sol = solve(eqs_sympy)

In [47]: sol
Out[47]: 
⎧   94               74     -53 ⎫
⎨w: ──,x: -20/9,y: ──,z: ────⎬
⎩   45               45      45 ⎭


Out[49]: dict_keys([w,x,y,z])

我在尝试使用 NameError 时没有得到 sol[w],因为我的 isympy 会话已经定义了 w 之类的变量,但我犯了关键错误。 keys 是符号,由 eqs 字符串创建。

我可以通过迭代键来获取值

In [52]: for i in sol.keys():
    ...:     print(sol[i])
    ...: 
94/45
-20/9
74/45
-53/45

甚至使用标准的 dict 方法:

In [53]: sol.values()
Out[53]: dict_values([94/45,-20/9,74/45,-53/45])

In [54]: list(sol.values())
Out[54]: 
⎡94         74  -53 ⎤
⎢──,──,────⎥
⎣45         45   45 ⎦

In [55]: sol.items()
Out[55]: dict_items([(w,94/45),(x,-20/9),(y,74/45),(z,-53/45)])

我可以从 eqs_sympy 中提取这些符号:

In [71]: eqs_sympy
Out[71]: 
[2⋅w + x + 4⋅y + 3⋅z = 5,w - 2⋅x + 3⋅z = 3,3⋅w + 2⋅x - y + z = -1,4⋅x - 5⋅z = -3]

In [72]: eqs_sympy[0]
Out[72]: 2⋅w + x + 4⋅y + 3⋅z = 5

In [73]: eqs_sympy[0].args[0].free_symbols
Out[73]: {w,z}

In [74]: tuple(eqs_sympy[0].args[0].free_symbols)
Out[74]: (x,z,w,y)

In [75]: x,y=tuple(eqs_sympy[0].args[0].free_symbols)

In [76]: sol[x]
Out[76]: -20/9

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?