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.

```

• Prev by Date: Re: Specifying arguments inside nested functions
• Next by Date: Re: Find last NZ in list
• Previous by thread: RE: Find last NZ in list
• Next by thread: Re: Find last NZ in list