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] ====