4
$\begingroup$

I know that I can convert an expression to list by

List @@ expr

But this does not work if expr is atomic, e.g.,

List @@ 1

will give you 1 instead of {1}. Of course I can check the length of expr first. But I wonder if there is simpler way to do this.

$\endgroup$
1
  • 3
    $\begingroup$ "But this does not work if expr contains only one term" - perhaps you meant to say that expr is atomic; List @@ f[1] works fine. $\endgroup$ – J. M.'s torpor May 18 '20 at 12:42
8
$\begingroup$

Like J.M. wrote, the question is if the expression is atomic, because Apply doesn't work on atomic expressions. If we disambiguate the two cases we should be fine:

Listify = If[AtomQ[#], {#}, List @@ #]&

Listify[42]
(* {42} *)

Listify[foo[1, 2, 3]]
(* {1, 2, 3} *)
$\endgroup$
6
$\begingroup$
ClearAll[toList]
toList = # /. { _[a__] :> {a}, a_?AtomQ :> {a}} &;

Examples:

list = {2, a, foo[a, b], s + t + u, Rational[1, 3], 
   Complex[5, 6], <|a -> x, b -> y, c -> z|>, DateObject[]};

Grid[Prepend[Transpose[{list, toList /@ list}], 
  Item[#, Background -> LightBlue] & /@ {"expr", "toList@expr"}], 
 Dividers -> All]

enter image description here

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.