PDA

View Full Version : Mathematica: Splitting a function into a list of terms


TenFold
Oct13-11, 05:10 PM
Hi,

I need to split an expression into a list of terms, i.e. an expression like:
a+b-c-d+...
into:
{a,b,-c,-d,...}.

Can you help? Thanks in advance.

TenFold
Oct13-11, 05:46 PM
Maybe it's not too slick, but I came up with this:

myString = "a+b-c-d";
If[StringTake[myString, 1] != "-", myString = "+" <> myString,];
list = StringSplit[myString, {"+" -> "1", "-" -> "-1"}];
listout = Range[Length[list]/2];
For[i = 1, i <= Length[list]/2, i++,
listout[[i]] = ToExpression[list[[2 i - 1]]]*ToExpression[list[[2 i]]]];
listout

which gives {a,b,-c,-d}.

Simon_Tyler
Oct13-11, 06:24 PM
String methods are probably not the best for this problem.

If you look at the FullForm[a+b-c-d] you see that it's
Plus[a, b, Times[-1, c], Times[-1, d]]
So all you need to do is make the Plus become a List.
This can be done using Apply, which has the short hand of @@.
So, the following should return True
List@@(a+b-c-d) == {a,b,-c,-d}

See http://stackoverflow.com/q/7697614/421225 for more discussion and different options.