Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python symphy中带符号的布尔运算_Python_Boolean_Sympy_Symbolic Math - Fatal编程技术网

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?