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

1 投票
2 回答
763 浏览
提问于 2025-04-18 08:56

我想把一堆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)]

这个函数会返回一个生成器,所以结果需要用列表来包裹起来。

撰写回答