如何在python中替换等式中的变量

如何在python中替换等式中的变量,python,equation,replace,Python,Equation,Replace,我有一个带等式的字符串,其中包括变量。例如: eq='(a+1)*c-d' val={'a':5,'c':'k','d':'300n'} 我还有一个字典,里面有变量的值。例如: eq='(a+1)*c-d' val={'a':5,'c':'k','d':'300n'} 正如你们所看到的,在同样的情况下,变量的值可以是其他变量,在某些情况下,eq中的变量并不是都是val 我需要用val中的值替换eq中的所有变量。 当然,直接代码类似于: for v in val.keys(): eq=

我有一个带等式的字符串,其中包括变量。例如:

eq='(a+1)*c-d'
val={'a':5,'c':'k','d':'300n'}
我还有一个字典,里面有变量的值。例如:

eq='(a+1)*c-d'
val={'a':5,'c':'k','d':'300n'}
正如你们所看到的,在同样的情况下,变量的值可以是其他变量,在某些情况下,eq中的变量并不是都是val

我需要用val中的值替换eq中的所有变量。 当然,直接代码类似于:

for v in val.keys():
  eq=re.sub(v,val[v],eq)
但这段代码在某些情况下会失败。例如,在变量列表中,变量为“n”和“nn”

那么,有人能想出更好的解决方案吗? 谢谢。

试试:

for k,v in val.items():
    eq = re.sub(r'\b' + k + r'\b', v, eq)
这将按变量的全名搜索变量,即如果
val={'x':'5'}
且方程包含诸如“xx”、“x2”甚至“2x”之类的子字符串,则不会替换这些字符串。

请尝试:

for k,v in val.items():
    eq = re.sub(r'\b' + k + r'\b', v, eq)

这将按变量的全名搜索变量,即,如果
val={'x':'5'}
且方程包含诸如“xx”、“x2”甚至“2x”之类的子字符串,则这些字符串将不会被替换。

另一种方法要求仅更改一点公式,并使用字符串函数“format”

使用关键字参数(不是很编程):

或者使用dict:

>>> '({a}+1)*{c}-{d}'.format(**{'a': 5, 'c': 'k', 'd': '300n'})
'(5+1)*k-300n'

这样做可以帮助用户识别什么时候没有被替换,什么时候应该被替换,并大大简化了代码。

另一种方法只需要稍微改变一下公式,并使用字符串函数“format”

使用关键字参数(不是很编程):

或者使用dict:

>>> '({a}+1)*{c}-{d}'.format(**{'a': 5, 'c': 'k', 'd': '300n'})
'(5+1)*k-300n'

这样做可以帮助用户识别什么时候没有被替换,什么时候应该被替换,并大大简化了代码。

这些变量是否有另一个字典(这些变量在您显示的字典的值部分)??你将如何替换它们的值?不,我没有其他字典。在我的例子中,在等式中留下一些变量是可以的。等式并不总是需要计算成一个数。@Alex。。伙计。那么,是什么困扰着您呢?因此,在这种情况下,您的预期输出是
kkk-300n
?@Rohit Jain所有具有已知值的变量都必须替换为它们的值。我有层次结构,变量需要从顶层传播到底层。因此,在每个级别中,变量都需要替换为上一级别中的变量。您是否有另一个用于这些变量的字典(在您显示的字典的值部分)??你将如何替换它们的值?不,我没有其他字典。在我的例子中,在等式中留下一些变量是可以的。等式并不总是需要计算成一个数。@Alex。。伙计。那么,是什么困扰着您呢?因此,在这种情况下,您的预期输出是
kkk-300n
?@Rohit Jain所有具有已知值的变量都必须替换为它们的值。我有层次结构,变量需要从顶层传播到底层。所以在每一层中,变量都需要替换为上一层的变量。问题是方程是一个变量数目未知的字符串。因此,任何等式和val
>>'({a}{a}{a}+1)*{c}-{d}的解决方案都必须是通用的。格式(**{a':5,'c':'k','d':'300n'})(555+1)*k-300n'
@whardier如何计算?问题是,等式是变量数目未知的字符串。所以,对于任何等式和val
>>'({a}{a}{a}+1)*{c}-{d}.格式(**{a':5,'c':'k','d':'300n'})(555+1)*k-300n'
@whardier您将如何评估它?在小示例中似乎还可以。将查看它在实际数据上是否工作良好。谢谢你,举个小例子就可以了。将查看它在实际数据上是否工作良好。非常感谢。