使用sympy的布尔运算

时间:2013-10-23 10:39:13

标签: python numpy sympy

我正在搜索一个可以进行布尔操作并发现同情的库。我编写了以下程序并执行布尔运算。我最终有例外。

import itertools
import sympy

data = ['iq,next_state=((!SE&D&RS)|(SE&SI)))']
data_1 = data[0].split(',')
for item in data_1:
    if item.find('next_state=')!= -1:
        item_list = item.split('=')
        item_op = item_list[len(item_list) -1].lstrip('(').rstrip(')')
        item_list = item_list[len(item_list) -1].replace('(','').replace(')','')
        item_list = item_list.replace("&",",").replace("|",",").replace("!","")
        item_list = item_list.split(',')
        item_list = list(set(item_list))
        print item_list

        item_op = "(" + item_op + ")"
        print "item-op",item_op
        list_exp = item_op.split('|')
        #print list_exp
        expr = sympy.sympify(item_op)
        variables = sorted(expr.free_symbols)
        for truth_values in sympy.cartes([0, 1], repeat=len(item_list)):
            values = dict(zip(variables, truth_values))
            print sorted(values.items()), expr.subs(values)

错误:

['SI', 'D', 'SE', 'RS']   #Need to truth table for 4 element
item-op (!SE&D&RS)|(SE&SI) #This operation need to perform
Traceback (most recent call last):
  File "next_state.py", line 21, in <module>
    expr = sympy.sympify(item_op)
  File "/.local/lib/python2.7/site-packages/sympy/core/sympify.py", line 297, in sympify
    raise SympifyError('could not parse %r' % a, exc)
sympy.core.sympify.SympifyError: Sympify of expression 'could not parse u'(!SE&D&RS)|(SE&SI)'' failed, because of exception being raised:
TokenError:

1 个答案:

答案 0 :(得分:3)

我认为!表示表达式中的不是(即逻辑补语)。在将字符串传递给~之前将其更改为sympy.sympify

In [15]: sympy.sympify("(~SE&D&RS)|(SE&SI)")
Out[15]: Or(And(D, Not(SE), RS), And(SE, SI))
相关问题