我想将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))
似乎有效,但感觉像是满口。
答案 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
做了类似的事情。