如何在python中替换数学方程中的值?

时间:2017-12-29 05:43:07

标签: python python-3.x scipy sympy

我从数据库中获取字典形式的数据:

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

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

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

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

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

4 个答案:

答案 0 :(得分:2)

假设您只有三个变量,

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)

答案 1 :(得分:2)

您可以使用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

答案 2 :(得分:1)

示例代码:

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

答案 3 :(得分:1)

基于之前的sympy答案,这里有一种方法,它在in_dict变量的大小和内容方面是动态的。最大的一步是将症状符号(x, y, z的python vars)映射到通过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