Re: How can this MapAt application be done more efficiently
- To: mathgroup at smc.vnet.net
- Subject: [mg4206] Re: How can this MapAt application be done more efficiently
- From: espen.haslund at fys.uio.no (Espen Haslund)
- Date: Thu, 13 Jun 1996 23:11:44 -0400
- Organization: Universitet i Oslo
- Sender: owner-wri-mathgroup at wolfram.com
In article <4pis80$iuo at dragonfly.wolfram.com>, cannon at alpha.centenary.edu says... > >I have written a function to Drop any zero's from a table of numbers. >Here is an example: > > In[161]:= dropzero[ {{5, 0}, {4, 1}, {3, 2, 0}, {3, 1, 1}} ] > > Out[161]= {{5}, {4, 1}, {3, 2}, {3, 1, 1}} > >I would like to learn how to do it more efficiently. In what I am >doing, the 0's will always occur as the last element of the inner >lists (although it would be nice to have it work in general). > Hi Joel: Here is one alternative using Select. I am not sure about the efficiency, but it is shorter: In: dropzero[lis_] := Map[Select[#, (# =!= 0)&] &, lis] In: dropzero[{{5, 0}, {4, 1}, {3, 2, 0}, {3, 1, 1}}] Out: {{5}, {4, 1}, {3, 2}, {3, 1, 1}} This should work for your case. It dont need the zeroes to appear last, but they should appear in 1. level sublists. Note the "nested" use of pure functions: The two #'s act at different levels. For a more general case (including also your case) the following may perhaps work: In: dropzeroAllLevels[lis_] := Map[If[ListQ[#], Select[#, (# =!= 0)&], #] &, Select[lis, (# =!= 0)&], Infinity] In: dropzeroAllLevels[{0,{5, 0}, {4, 1}, {3, 2, 0}, {3, 1, {1,0,1}}}] Out: {{5}, {4, 1}, {3, 2}, {3, 1, {1, 1}}} Hope this is of some help -Espen ==== [MESSAGE SEPARATOR] ====