【问题标题】:How to substitute values in mathematics equations in python?如何在python中替换数学方程中的值?
【发布时间】:2018-06-09 14:53:34
【问题描述】:

我正在从数据库中以字典形式获取数据:

in_dict = {"x":2,"y":"x+2","z":"y+2"}

我的数学方程以字符串的形式得到:

eqn = "(x+2)*y/z"

在方程中替换值并给出最终解的最简单方法是什么?

注意:应该知道字典中的值是随机出现的。

【问题讨论】:

  • 这个问题的答案是什么?您还没有发布预期的输出?
  • 人们依赖x 是一个常量的示例结构,yz 被解释为x 的表达式。总是这样吗?
  • 不,方程可以有任意数量的变量,并且不同的变量依赖于不同的变量。

标签: python python-3.x scipy sympy


【解决方案1】:

假设你只有三个变量,

x = d["x"]
y = eval(d["y"]) # as it is a string
z = eval(d["z"]) # as it is a string

你可以使用 eval:

x = eval("(x+2)*y/z")

[编辑 2] 您可以使用 itemgetter 进行解包:

>>> from operator import itemgetter
>>> stuff = {'a': '1', 'b': 'a+1', 'c': '3', 'd': '4'}
>>> a, b, c = list(map(eval, itemgetter('a', 'b', 'c')(stuff))) # for automatic evaluation, but all must be string
>>> a, b, c
(1, 2, 3)

【讨论】:

  • eval 小心并根据 x 评估 y 和 z 的结果
【解决方案2】:

示例代码:

from __future__ import division
foo = {"x":2,"y":"x+2","z":"y+2"}
x = "(x+2)*y/z"
x = ("(x+2)*y/z"
     .replace('z', '({})'.format(foo['z']))
     .replace('y', '({})'.format(foo['y']))
     .replace('x', '({})'.format(foo['x'])))
print('x = {}'.format(x))
print('x = {}'.format(eval(x)))

示例输出:

x = ((2)+2)*((2)+2)/(((2)+2)+2)
x = 2.66666666667

【讨论】:

  • 这只有在x 是唯一的常量变量时​​才有效,对吧?
  • 如果 x 是唯一的常数(根据问题),则 eval 部分将起作用。是的。
【解决方案3】:

您可以使用Sympy 来求解这些方程。如果您还没有安装它,请使用pip install sympy

import sympy

in_dict = {"x":2,"y":"x+2","z":"y+2"}
x, y, z = sympy.symbols('x y z')
sympy.sympify("(x+2)*y/z").evalf(subs={x:in_dict['x'], y:in_dict['y'], z:in_dict['z']})

这会给你输出:2.66666666666667

【讨论】:

    【解决方案4】:

    在之前的sympy 答案的基础上,这里有一种关于in_dict 变量的大小和内容的动态方法。最大的一步是将 sympy 符号(x, y, z 的 python 变量)映射到它们通过您的 in_dict 传递的符号表示

    import sympy
    
    def eval_eqn(eqn,in_dict):
        subs = {sympy.symbols(key):item for key,item in in_dict.items()}
        ans = sympy.simplify(eqn).evalf(subs = subs)
    
        return ans
    

    原始输入:

    in_dict = {"x":2,"y":"x+2","z":"y+2"}
    eqn = "(x+2)*y/z"
    print(eval_eqn(eqn,in_dict))
    

    2.66666666666667

    一组不同的输入:

    in_dict = {"a":2, "b": 4, "c":"a+2*b","d":"4*b + c"}
    eqn = "c**2 + d**2"
    print(eval_eqn(eqn,in_dict))
    

    776.000000000000

    【讨论】:

    • 如果 dict 值具有数据框列值怎么办。假设我有一列 df[bikes] 它有多个值。当我们分配给字典'a'时,函数会起作用吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2021-12-04
    • 2022-09-23
    • 1970-01-01
    • 2021-07-08
    相关资源
    最近更新 更多