The order in printing can be controlled with the order flag to the printer. Using latex(expr, order='rev-lex') will cause polynomials to print in reverse lexicographic order, which is the order you want.
It's not a good idea to use evaluate=False to try to control printing behavior, as this can break other things. Instead, you should use the existing flags in the printer in question, or customize the printer with a subclass if the built-in behavior doesn't meet your needs. Aaron Meurer On Sat, Feb 10, 2024 at 1:58 PM Thomas Ligon <thomassli...@gmail.com> wrote: > > I am trying to reverse the order of an expression before printing it for my > documentation, and I want ascending order, but SymPy always gives me > descending order. All of the expressions are polynomials, specifically > partial sums of power series. Since, according to Internet searches, there is > no easy way to do this, I have tried a number of things, including > manipulating the expression tree. The original expression is always Add of a > tuple, and each tuple is a rational number and x**n. When I loop through the > expression and Add the components, I always get the same order. The elegant > solution would be to reverse the tuple and Add it all at once, but that is > deprecated and gives me a tuple instead of a sum. > > Here is some sample code, a test program that demonstrates the problem. > > from sympy import symbols, Rational, Add, latex, Eq > x = symbols('x') > lhs = symbols('X') > rhs = Rational(3)/Rational(4)*x**3 + Rational(2)/Rational(5)*x**2 + > Rational(1)/Rational(4)*x > X1 = rhs.args > #X2 = X1[::-1] # Why don't I need this? My debugger shows the expression and > the tuple in reverse order. > X2 = X1 > # Try the expected order of Add. This produces a sum, but with an extra set > of parantheses, and not the desired order. > X3 = X2[0] > X2R = X2[1:len(X2)] > for indT in range(0, len(X2R)): > termT = X2R[indT] > X3 = Add(X3, termT, evaluate=False) > # Try the other order of Add. This looks the same as X3. > X4 = X2[0] > for indT in range(0, len(X2R)): > termT = X2R[indT] > X4 = Add(termT, X4, evaluate=False) > # Try single step. This is deprecated, gives the correct order, but returns a > tuple instead of a sum. > #X2 = X1[::-1] # Why don't I need this? > X2 = X1 > X5 = Add(X2, evaluate=False) > > print(latex(Eq(lhs, rhs))) # original order > print(latex(Eq(lhs, X3))) # still original order > print(latex(Eq(lhs, X4))) # still original order > print(latex(Eq(lhs, X5))) # desired order, but tuple instead of sum > > -- > You received this message because you are subscribed to the Google Groups > "sympy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to sympy+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/sympy/166a5149-26b2-47f7-9956-943b9d379d92n%40googlegroups.com. -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to sympy+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/CAKgW%3D6%2BR-9-nUYv8_L76t9idRy54MA8kYJY433-ujENf%2B8Ct8w%40mail.gmail.com.