2014-06-07 27 views
1

我想將SymPy表達式的列表按照詞典順序進行規範化。或者至少有一些它的外表。這是簡單的SymPy 0.7.2,似乎已經打破作爲...如何在SymPy中規範化表達式列表?

>>> import sympy 
>>> sympy.__version__ 
'0.7.4.1' 

觀察:

>>> f, g = sympy.symbols('f g', cls=sympy.Function) 

>>> sorted([f, g]) 
[f, g] 

>>> sorted([g, f]) 
[f, g] 

酷。我回來了詞典排序。現在,如果我申請的功能...

>>> x = sympy.symbols('x') 

>>> sorted([f(x),g(x)]) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python2.7/dist-packages/sympy/core/relational.py", line 226, in __nonzero__ 
    raise TypeError("symbolic boolean expression has no truth value.") 
TypeError: symbolic boolean expression has no truth value. 

...這裏是TypeError字符串已經從谷歌搜索出有關在其他地方,但我已經無法辨別一種解決方法。

我看到與[f(x), g(x)].sort().相同的消息使用set([f(x), g(x)])在我的大型用例中不起作用,因爲我需要允許重複。

對SymPy 0.7.2和0.7.4友好的方式來規範SymPy表達式列表的任何想法?玩起來有點sorted([f(x),g(x)], lambda x,y: x.compare(y))似乎工作,但感覺像一口。

回答

3

使用「命令」功能:

>>> list(ordered((g(x),f(x)))) 
[f(x), g(x)] 

它返回一個發電機 - 這就是爲什麼結果是包裹着列表。

>>> sorted([f(x), g(x)], key=default_sort_key) 
[f(x), g(x)] 

我相信ordered有類似的功能:

+0

完美!謝謝。 'sympy.ordered'給任何想要使用答案的人。 –

0

如果你想要一個任意的,而是一致的順序,使用default_sort_key鍵功能分類SymPy不再比較隨意的表達,類似的Python 3。