I would like to get a List
(ideally a set -- discarding repetition -- but assuming there's no direct way to do this I'll just use Union
) of the leaves from a given expression.
For example, the expression
ArcTan[(-1 + 2*x)/Sqrt[3]]/Sqrt[3]
has a LeafCount
of 18:
- -1 (3)
- 2 (3)
- 3 (2)
- x
- ArcTan
- Plus
- Power (2)
- Rational (2)
- Times (3)
so I would like something like
{-1, 2, 3, x, ArcTan, Plus, Power, Rational, Times}
Actually, I really just want the functions so
{ArcTan, Plus, Power, Rational, Times}
would be ideal -- but presumably there's some not-too-difficult way to filter these when I have them.
I've had some luck with
H[s_] := If[LeafCount[s] == 1, s, Head[s]]
H /@ Level[expr, 1, Heads -> True]
H /@ Level[expr, 2, Heads -> True]
(* ... *)
but I feel like there must be a better way.
{0,-1}
, is quite clever: level 0 -> the entire expression, level -1 -> everything without subparts (i.e. the leaves). So, it essentially tellsCases
to work from top to bottom of the expression tree. Nice! – Meyerhof