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