如何在SymPy中规范化表达式列表?
我想把一堆SymPy表达式整理成字典序的顺序。或者说,至少要有点像字典序的样子。在SymPy 0.7.2版本的时候,这个操作很简单,但从某个版本开始就出问题了……
>>> 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))
,这个方法好像有效,但感觉有点复杂。
2 个回答
0
SymPy现在不再像以前那样随便比较表达式了,这一点和Python 3很像。如果你想要一个随意但又一致的排序,可以使用default_sort_key
这个关键函数来进行排序:
>>> sorted([f(x), g(x)], key=default_sort_key)
[f(x), g(x)]
我觉得ordered
也有类似的功能。
3
使用'ordered'函数:
>>> list(ordered((g(x),f(x))))
[f(x), g(x)]
这个函数会返回一个生成器,所以结果需要用列表来包裹起来。