2015-06-21 64 views
0

這可能是一個非常基本的問題,但我想知道在閱讀完文檔後是否缺少sympy功能,或者如果真的沒有包含這個用例。如何評估sympy中的表達式樹?

我有以下表述:

a = sympify("b + 5") 
b = sympify("c + 5") 
c = sympify("5") 

我試圖評估。 有沒有什麼辦法sympy做所有的遞歸搜索和替換你,或者我真的不得不手動嗎?

如:

eval(str(eval(str(a)))) 

回答

0

使符號和表達之間的區別:

import sympy as sy 
a, b, c = sy.symbols('a:c') 

a_expr = sy.sympify("b + 5") 
b_expr = sy.sympify("c + 5") 
c_expr = sy.sympify("5") 

sy.solve([sy.Eq(a,a_expr), sy.Eq(b,b_expr), sy.Eq(c,c_expr)]) 

產生

{c: 5, b: 10, a: 15} 

以上,a是一個符號,但a_expr是一個表達式:

In [117]: type(a) 
Out[117]: sympy.core.symbol.Symbol 

In [118]: type(a_expr) 
Out[118]: sympy.core.add.Add 

給出的公式的一個字典如

formulas = {'a': 'b+5', 'b': 'c+5', 'c': '5'} 

你可以形成具有list comprehension

equations = [sy.Eq(sy.symbols(variable), sy.sympify(expr)) 
      for variable, expr in formulas.items()] 

方程和求解方程的系統與

solution = sy.solve(equations) 
# {c: 5, b: 10, a: 15} 

爲什麼你不應該使用sympy.var

當動態變量處理 - 變量,其名稱是未知的,直到 運行時間 - 最好是避免使用sy.varsy.var將該變量的名稱 添加到全局名稱空間。這樣做的唯一目的是,如果你 要參考變量名稱。但通過假設,變量 的名字在運行時間之前是未知的。所以腳本代碼不應該 - 實際上, 不應該能夠 - 通過名稱引用變量。因此,如果變量是真正動態的,則使用sy.var應該沒用。

然而這並不是真正的問題。動態變量名稱(字符串) 可以

In [22]: formulas.keys() 
Out[22]: ['a', 'c', 'b'] 

上市和sy.Symbols可以

In [23]: solution.keys() 
Out[23]: [c, b, a] 

上市所以,你可以寫循環而不必定義 訪問每個變量每個符號的全局變量名稱。

+0

謝謝!一旦你理解了這個概念,它就變得如此明顯。 是否有任何方式以動態方式聲明符號(例如,來自列表或長度未知的字典)? – gimili

+0

你的意思是你想要給出一個像[['b + 5','c + 5','5']'這樣的列表來聲明符號'a','b','c'嗎?你知道預先顯示在列表中的變量名嗎? – unutbu

+0

這個想法是能夠計算一個動態系統。鑑於例如字典{'a':'b + 5','b':'c + 5','c':'5'} 有沒有爲字典的每個條目(鍵)創建所有符號的方法,而事先不知道字典將會是多久以及密鑰將會有哪些名字? – gimili