Sorting non-numerical lists


The Sort function will by default sort from lowest to highest.

In[1]:= Sort[{3, 1, 4}]
Out[1]= {1, 3, 4}

However, if the list contains non-numerical values, it will sort it incorrectly

In[2]:= zeroes = {2 Pi - 2 ArcTan[Sqrt[2 + Sqrt[5]]], 
   2 ArcTan[Sqrt[2 + Sqrt[5]]], 2 Pi + 2 ArcTan[Sqrt[2 + Sqrt[5]]]};

In[3]:= zeroes // N
Out[3]= {4.04615, 2.23704, 8.52022}

In[4]:= Sort[zeroes] // N
Out[4]= {4.04615, 2.23704, 8.52022}

One could use the Greater function as a parameter to Sort and then reverse the input

In[5]:= Reverse@Sort[zeroes, Greater] // N
Out[5]= {2.23704, 4.04615, 8.52022}

There is no Lesser function in Mathematica, but there must be a better way to do this, without converting the data to floats.


Posted 2014-03-10T09:58:49.607

Reputation: 85

Question was closed 2015-03-25T10:05:53.550


This is shown in the last two examples under Scope on the manual page for Sort.

– Michael E2 – 2014-03-10T10:20:53.910

As Michael E2 states, in the documentation. If you're trying to avoid conversion for say performance, makes no difference, when using e.g. Less on expressions, they're evaluated to numeric where possible. – ciao – 2014-03-10T10:37:49.063



The function Less is what you can use.

list = {2 Pi - 2 ArcTan[Sqrt[2 + Sqrt[5]]], 
   2 ArcTan[Sqrt[2 + Sqrt[5]]], 2 Pi + 2 ArcTan[Sqrt[2 + Sqrt[5]]]};
Sort[list, Less]


Sort[list, #1 < #2 &]

Or you could use:

SortBy[list, N@# &]


Posted 2014-03-10T09:58:49.607

Reputation: 53 491


Sort[zeros// N]
(* {2.23704,4.04615,8.52022} *)

Mathematica is doing exactly what it should. You were sorting the expressions...

Ah, ninja'd... As ubpdqn posted, SortBy if you wish to sort (and keep form) of expressions by numeric value.


Posted 2014-03-10T09:58:49.607

Reputation: 23 752

+1 not ninja'd...//N vs , 'win' by 2 characters (3 if you count my unnecessary space), am ignoring the first argument :-) – ubpdqn – 2014-03-10T10:15:18.197

You're not answering the question which specifically asked for a solution without using conversion to floating point precision. – jVincent – 2014-03-10T10:16:55.500

@jVincent: not sure what your point (if any) is, I state quite clearly use of SortBy as also posted by ubodqn gives the expressions...not to mention the OP is quite ambiguous re: exactly what form of result is desired. – ciao – 2014-03-10T10:19:30.060