Re: Sorting nested list

• To: mathgroup at smc.vnet.net
• Subject: [mg57476] Re: Sorting nested list
• From: "Carl K. Woll" <carlw at u.washington.edu>
• Date: Sun, 29 May 2005 01:03:34 -0400 (EDT)
• Organization: University of Washington
• References: <d6us0f\$ivm\$1@smc.vnet.net> <d76o0i\$7mu\$1@smc.vnet.net>
• Sender: owner-wri-mathgroup at wolfram.com

```"plizak" <plizak at gmail.com> wrote in message
news:d76o0i\$7mu\$1 at smc.vnet.net...
>I have a similar problem, I need to sort the same kind of list
>
> {{a,{2,4,1.,...}}, {c, {1,2,...}},{b,{3.2,-2,.­..}}}
>
> but I need to sort it based on the first element of each subarray,
> while keeping the second element the same.
>
> I did a pretty ugly solution (like 12 lines of code).  Is there a
> quicker more elegant way to sort this?
>

The simplest idea is to use Sort with an ordering function. An alternate
idea, which is in general much quicker, is to generate a key for each
element in the array, and then use Ordering on this list of keys. In your
case, we would do the following:

In[12]:=
data = {{a, {2, 4, 1.}}, {c, {1, 2}}, {b, {3.2, -2}}};
keys = data[[All, 2, 1]]
Out[13]=
{2, 1, 3.2}

Then, use Ordering to get the sorted list:

In[14]:=
data[[Ordering[keys]]]
Out[14]=
{{c, {1, 2}}, {a, {2, 4, 1.}}, {b, {3.2, -2}}}

Let's compare the timing for this approach versus using Sort with an
ordering function:

data = Table[{Random[], Table[Random[], {10}]}, {10^5}];

In[16]:=
r1 = data[[Ordering[data[[All, 2, 1]]]]]; // Timing
r2 = Sort[data, #2[[2, 1]] > #1[[2, 1]] &]; // Timing
r1 === r2
Out[16]=
{0.157 Second, Null}
Out[17]=
{6.343 Second, Null}
Out[18]=
True

We see that the Ordering approach is about 40 times faster for this data
set.

Carl Woll

```

• Prev by Date: Re: Re: Printing - mathematica cropping the right hand side... :(
• Next by Date: Re: global fit
• Previous by thread: Re: Sorting nested list
• Next by thread: Applying a list of functions to a list of arguments