Python symphy中带符号的布尔运算
布尔变量对符号的布尔运算会产生Python symphy中带符号的布尔运算,python,boolean,sympy,symbolic-math,Python,Boolean,Sympy,Symbolic Math,布尔变量对符号的布尔运算会产生TypeError,但反之则没有问题: >>> from sympy import * >>> x = Symbol('x', bool=True) >>> x ^ True Not(x) >>> True ^ x Traceback (most recent call last): File "<pyshell#3>", line 1, in <module>
TypeError
,但反之则没有问题:
>>> from sympy import *
>>> x = Symbol('x', bool=True)
>>> x ^ True
Not(x)
>>> True ^ x
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
True ^ x
TypeError: unsupported operand type(s) for ^: 'bool' and 'Symbol'
但是,对于我目前的任务,除了要处理大约200个符号外,不可能用
try实现这一点。我如何才能做到这一点?这很难看,但它应该满足您的要求:
expressions = [
r'S[15] ^ (S[19] & S[72]) ^ S[112]',
]
for e in expressions:
try:
eval(e) # Do your thing
except TypeError:
pass
这很难看,但它应该满足您的要求:
expressions = [
r'S[15] ^ (S[19] & S[72]) ^ S[112]',
]
for e in expressions:
try:
eval(e) # Do your thing
except TypeError:
pass
这是一个bug,它已在Symphy的开发版本中修复,并将在下一个版本中修复。如果您不能使用git版本并且迫不及待,一个解决办法是在sympy.logic.boolalg.Boolean
中使用monkeypatch\uuuuuuuuuxor\uuuuuxor
(等等),使之等于sympy.logic.boolalg.Boolean.\uuuuuuuxor\uxor
In [1]: from sympy.logic.boolalg import Boolean
In [2]: Boolean.__rxor__ = Boolean.__xor__
In [3]: True ^ x
Out[3]: ¬ x
顺便说一下,Symbol('x',bool=True)
什么也不做。它在符号中添加了假设x.is_bool
,但由于SymPy不知道这是一个真正的假设,因此它没有做任何事情 这是一个bug,它已在Symphy的开发版本中修复,并将在下一版本中修复。如果您不能使用git版本并且迫不及待,一个解决办法是在sympy.logic.boolalg.Boolean
中使用monkeypatch\uuuuuuuuuxor\uuuuuxor
(等等),使之等于sympy.logic.boolalg.Boolean.\uuuuuuuxor\uxor
In [1]: from sympy.logic.boolalg import Boolean
In [2]: Boolean.__rxor__ = Boolean.__xor__
In [3]: True ^ x
Out[3]: ¬ x
顺便说一下,Symbol('x',bool=True)
什么也不做。它在符号中添加了假设x.is_bool
,但由于SymPy不知道这是一个真正的假设,因此它没有做任何事情 如果你必须处理200个符号;我希望你用的是回路。如果是,为什么不能使用try-except块?@plg我使用的是numpy.array
,S
,符号和布尔值任意混合。我有如下操作:S[15]^(S[19]&S[72])^S[112]
。现在,在不知道哪一个是布尔值,哪一个是符号的情况下,我无法进行try-Exception操作,因为这样的try-Exception块的数量将呈指数增长。要使用循环,您可以定义一个元组列表:[(15,19,73,112),…]
如果操作不总是相同的话,这将不起作用。您还可以在try except中使用表达式列表['S[15]^(S[19]&S[72])^S[112],…]
,以及eval
。除非我没有其他解决方案,否则我不会这么做。@plg仍然不清楚。你能给我一个MWE吗?作为将来的参考,什么是MWE?如果你必须处理200个符号;我希望你用的是回路。如果是,为什么不能使用try-except块?@plg我使用的是numpy.array
,S
,符号和布尔值任意混合。我有如下操作:S[15]^(S[19]&S[72])^S[112]
。现在,在不知道哪一个是布尔值,哪一个是符号的情况下,我无法进行try-Exception操作,因为这样的try-Exception块的数量将呈指数增长。要使用循环,您可以定义一个元组列表:[(15,19,73,112),…]
如果操作不总是相同的话,这将不起作用。您还可以在try except中使用表达式列表['S[15]^(S[19]&S[72])^S[112],…]
,以及eval
。除非我没有其他解决方案,否则我不会这么做。@plg仍然不清楚。你能给我一个MWE吗?作为将来的参考,什么是MWE?