使用关系运算符计算表达式时与sympify不一致的行为

2024-06-15 06:45:22 发布

您现在位置:Python中文网/ 问答频道 /正文

当我使用sympify解析带有大于运算符的表达式时,我得到了一个以StrictGreaterThan作为根的表达式。但是,替换==运算符,sympify将表达式计算为布尔值False。如何防止sympy用==计算表达式,从而得到一个与>运算符相同的一般表达式?你知道吗

from sympy import *

In [2]: s1 = 'a - 4 > b + 5'

In [3]: expr1 = sympify(s1)

In [4]: type(expr1)

Out[4]: sympy.core.relational.StrictGreaterThan

In [5]: s2 = 'a - 4 == b + 5'

In [6]: expr2 = sympify(s2)

In [7]: type(expr2)

Out[7]: bool

Tags: infromimportfalse表达式type运算符out
2条回答

http://docs.sympy.org/dev/gotchas.html所述

Double equals signs (==) are used to test equality. However, this tests expressions exactly, not symbolically.

您可以使用sympy.Eq,如

In [54]: sympy.Eq(sympy.abc.a - 3, sympy.abc.b + 5)
Out[54]: a - 3 == b + 5

In [55]: sympy.GreaterThan(sympy.abc.a - 3, sympy.abc.b + 5)
Out[55]: a - 3 >= b + 5

不管怎样,这看起来真的不一致。你知道吗

我在使用sympy时解决这个问题的一种方法是将RHS转换为LHS,然后对字符串进行sympify()。
i、 e.将LHS == RHS改为LHS - RHS

exprStr =  'a - 4 == b + 5'
indOfEq = exprStr.find('==')
if indOfEq != -1:
   splitExpr  = exprStr.split('=')
   if len(splitExpr)==2:
      exprStr = splitExpr[0]+'-('+splitExpr[1]+')'
expr2 = sympify(exprStr )

相关问题 更多 >