Re: Find last NZ in list

*To*: mathgroup at smc.vnet.net*Subject*: [mg46113] Re: Find last NZ in list*From*: Mark Fisher <mefisher_news at bellsouth.net>*Date*: Sat, 7 Feb 2004 04:01:56 -0500 (EST)*References*: <bvvnir$j5k$1@smc.vnet.net>*Sender*: owner-wri-mathgroup at wolfram.com

Carlos Felippa wrote: > 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. > How about this? FLN[data_ /; Union[data] == {0}] := 0 FLN[data_] := (Length[data] + 1) - Position[Reverse[data], _?(# =!= 0 &), {1}, 1, Heads -> False][[1, 1]] The first definition applies if all the elements are zero. Otherwize, the second definition reverses the data and stops when the first nonzero match is found. --Mark