Re: Find last NZ in list
- To: mathgroup at smc.vnet.net
- Subject: [mg46141] Re: Find last NZ in list
- From: drbob at bigfoot.com (Bobby R. Treat)
- Date: Sat, 7 Feb 2004 04:03:03 -0500 (EST)
- References: <bvvnir$j5k$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Try this: nonZero = If[Developer`ZeroQ@#, False, True, True] &; find = 1 + Length@# - First@First@(Position[Reverse@#, _?nonZero, 1, 1, Heads -> False] /. {} -> {{1 + Length@#}}) &; test = {{1, 2, 3, 4, 0, a, b - b, 0, 0}, {0, 0, 0, 0, 0, 0, 0}}; find /@ test {6, 0} If the strings can be built in reversed order in the first place, that might make things noticeably faster (but maybe not). (Then you'd omit "Reverse@" in the above code.) Bobby carlos at colorado.edu (Carlos Felippa) wrote in message news:<bvvnir$j5k$1 at smc.vnet.net>... > This is kind of an "esthetics" question. In a program I am writing > I need to find the last nonzero entry of a 1D list millions of > times. For example FindLastNonzero[{1,2,3,4,0,a,b-b,0,0}] -> 6, > and FindLastNonzero[{0,0,0,0,0,0,0}] -> 0. > Here are two ugly C-style implementations: > > FindLastNonzero[a_]:=Module[{n=Length[a]}, > For [i=n,i>0,i--, If [a[[i]]==0,Continue[],Return[i],Return[i]]]; > Return[0]]; > > FindLastNonzero[a_]:=Module[{n=Length[a]}, > For [i=n,i>0,i--, If [a[[i]]!=0,Return[i],Continue[i],Return[i]]]; > Return[0]]; > > Is there a built-in function, or something more elegant, > available to do this job? Find only works for text streams. > > Note that the If case "cannot tell if entry is NZ" is important for > symbolic lists. That case should be evaluated as NZ.