Re: Appending to Lists
- To: mathgroup at smc.vnet.net
- Subject: [mg27059] Re: Appending to Lists
- From: Tom Burton <tburton at cts.com>
- Date: Sat, 3 Feb 2001 04:58:54 -0500 (EST)
- Organization: Brahea Consulting
- References: <95b686$4mr@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hello, Here is a straighforward improvement that seems adequately fast for the modest lists you are using so far. As an example, consider the following lists b and c: In[66]:= b = Array[B, {10}] Out[66]= {B[1], B[2], B[3], B[4], B[5], B[6], B[7], B[8], B[9], B[10]} In[67]:= c = Table[Random[Integer,{1,3}],{10}] Out[67]= {1, 2, 1, 2, 2, 1, 3, 3, 2, 2} I assume that lists b and c are necessarily of equal length, so we can combine them to speed processing. Step 1 is to Sort and then Split the combined list: In[68]:= temp1 = Split[Sort[Transpose[{c, b}]], First[#1] == First[#2] & ] Out[68]= {{{1, B[1]}, {1, B[3]}, {1, B[6]}}, {{2, B[2]}, {2, B[4]}, {2, B[5]}, {2, B[9]}, {2, B[10]}}, {{3, B[7]}, {3, B[8]}}} Step 2 is to strip elements of c from the result: In[69]:=temp2 = Map[Last, temp1, {2}] Out[69]= {{B[1], B[3], B[6]}, {B[2], B[4], B[5], B[9], B[10]}, {B[7], B[8]}} Step 3 is to append zeroes as needed In[71]:= a = With[{L = Max[Length /@ temp2]}, Map[Join[#1, Table[0.0, {L - Length[#1]}]] &, temp2] ] Out[71]= {{B[1], B[3], B[6], 0., 0.}, {B[2], B[4], B[5], B[9], B[10]}, {B[7], B[8], 0., 0., 0.}} Step 1 requires about 2.4 seconds to process lists of length 50000 on my 400 MHz PC. The times for steps 2 and 3 are negligible. On 1 Feb 2001 03:20:22 -0500, in comp.soft-sys.math.mathematica you wrote: >Hi, > >I have a function that creates a list (a) from another list (b). The list >elements are re-grouped in the new list according to a third list (c)... Tom