如何在SymPy中规范化表达式列表?

时间:2014-06-07 03:29:42

标签: python 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 :(得分:3)

使用'ordered'功能:

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

它返回一个生成器 - 这就是结果用list包装的原因。

答案 1 :(得分:0)

SymPy不再任意比较表达式,类似于Python 3.如果您想要任意但一致的顺序,请使用default_sort_key键函数进行排序:

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

我相信ordered做了类似的事情。