如何在Sympy中找到表达式中的所有项

14
我有一个表达式: 1/(x+1)+4*x/(x-1)+3-4*x**2+10*x**2 我需要一个包含该表达式每个项的列表。
即,[1/(x+1), 4*x/(x-1), 3, -4*x**2, 10*x**2] 更新:它不应将相似项合并。因此,列表应单独列出-4*x** 2和10*x** 2,而不是在合并相似项后得到6*x**2的结果。
3个回答

8
正确的方法是使用Add.make_args。这与Bjoern的答案中的expr.args相同,只是如果表达式不是一个Add(单项),它仍然会给出该项,而不是进入该表达式。
In [20]: expr = 1/(x+1)+4*x/(x-1)+3-4*x**2

In [21]: print(Add.make_args(expr))
(3, 1/(x + 1), -4*x**2, 4*x/(x - 1))

@asmeurer 谢谢,但是这个问题和我在下面的评论中提到的 @Bjoern 是一样的。它会收集相似项。 - harsh
@harsh 在我的回答中的列表与你在问题中所指出想要的列表是一样的(除了重新排序)。如果重新排序是一个问题,我很抱歉,因为SymPy不跟踪表达式从哪里开始。如果有其他问题,请编辑您的问题并予以澄清。 - asmeurer
如果之前没有说明清楚,我很抱歉。我希望不要收集类似的项。我已经更新了问题。如果让你感到困惑,我很抱歉。将它视为一个字符串可以解决问题。 - harsh

2

根据问题和评论,如果您可以将表达式作为字符串获取,则可以使用以下方法来避免术语收集。

(sympify("1/(x+1)+4*x/(x-1)+3-4*x**2+10*x**2", evaluate=False)).args

这将返回所有术语,而不收集相似的术语。

1
在这种情况下,非常容易:
>>> expr = 1/(x+1)+4*x/(x-1)+3-4*x**2
>>> expr.args
⎛     1        2   4⋅x ⎞
⎜3, ─────, -4⋅x , ─────⎟
⎝   x + 1         x - 1⎠

谢谢@Bjoern,但如果有类似的项,args会将它们收集起来(例如1 /(x + 1)+4 * x /(x-1)+3-4 * x ** 2 +10 * x ** 2)。有没有可能停止这个功能? - harsh
@FermiparadoxSO 是的,没有引号。对于混淆感到抱歉。 - harsh
@harsh 离题了:你是说 1/(x+1)+4*x/(x-1)+3-4*x**2+10*x**2 吗?(双 * 之间的文本会被转换为粗体,除非您将其放在代码格式 `` 中) - user
@harsh 实际上不是 .args 收集它们,而是在构造时发生,请尝试:Add(1/(x+1), 4*x/(x-1), 3, -4*x**2, 10*x**2, evaluate=False) - Bjoern Dahlgren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接