MathGroup Archive 1996

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: How can this MapAt application be done more efficiently


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


  • Prev by Date: Running Mathematica 2.1 under Windows95?
  • Next by Date: Re: How can this MapAt application be done more efficiently
  • Previous by thread: How can this MapAt application be done more efficiently
  • Next by thread: Re: How can this MapAt application be done more efficiently