Re: Position of Last Element in List
- To: mathgroup at smc.vnet.net
- Subject: [mg94174] Re: [mg94130] Position of Last Element in List
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Sat, 6 Dec 2008 06:16:45 -0500 (EST)
- References: <200812051033.FAA25138@smc.vnet.net> <3E66AD62-46BB-483B-9A30-E33029DA4017@mimuw.edu.pl>
Here is a slightly improved version (essentially only in the case when
p is the last element of the list):
lastPos2[ls_, p_] := If[Last[ls] === p, 1,
Length[Last[Split[Unitize[ls - p]]]] + 1]
Andrzej Kozlowski
On 5 Dec 2008, at 23:35, Andrzej Kozlowski wrote:
>
> On 5 Dec 2008, at 19:33, Raffy wrote:
>
>> I'm looking for the fastest way to find the last position of an
>> element at level 1 in a list.
>>
>> The fastest way, which is still extremely bloated and extremely slow,
>> appears to be:
>>
>> lastPos[v_List,p_:True,default_:$Failed]:=(
>> $Temp=Position[Reverse[v],p,{1},1,Heads->False];
>> If[Length[$Temp]>0,$Temp[[1,1]],default]
>> );
>>
>> Any suggestions?
>>
>> Use the following code to compare against lastPos:
>>
>> v = Range[1000000];
>> Do[lastPos[v,900000],{100}]//Timing
>>
>
>
> This is slightly faster on my 2.2 gigahertz MacBook:
>
> lastPos1[v_List, p_] :=
> With[{m = Last[Split[Unitize[v - p]]]}, If[m[[-1]] === 0, 1,
> Length[m] + 1]]
>
> In[3]:= v = Range[1000000];
> Do[lastPos[v, 900000], {100}] // Timing
> Out[4]= {11.4684, Null}
> In[5]:=
> Do[lastPos1[v, 900000], {100}] // Timing
> Out[5]= {9.56562, Null}
>
> Note that if p is not present instead of returning $Failed this
> returns the length of the list + 1.
>
> Andrzej Kozlowski
>
> Andrzej Kozlowski
- References:
- Position of Last Element in List
- From: Raffy <raffy@mac.com>
- Position of Last Element in List