Re: List element manipulation
- To: mathgroup at smc.vnet.net
- Subject: [mg25549] Re: List element manipulation
- From: adam_smith at my-deja.com
- Date: Sat, 7 Oct 2000 03:35:53 -0400 (EDT)
- References: <8r19qf$hvt@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
I had tried this post before but it seems to have been lost. I noted that a couple of people provided the solution: MapAt[# - 1 &, Range[116, 164, 8], -1] A similar thing works with ReplacePart and I have found that there can be a significant speed advantage for ReplacePart as demonstrated below running Version 4.0.1 on a 333 MHz PII with 192 MByte ram. For 100,000 long list 0.01 sec. for ReplacePart vs 0.15 sec for MapAt. Adam Smith MapAt vs. ReplacePart For small lists there is no timing difference In[1]:= Timing[ MapAt[# - 1 &, Range[116, 164, 8], -1] ] Timing[ Range[116, 164, 8] // ReplacePart[#, Last[#] - 1 , -1] &] Out[1]= {0. Second, {116, 124, 132, 140, 148, 156, 163}} Out[2]= {0. Second, {116, 124, 132, 140, 148, 156, 163}} However, for very large lists ReplacePart is significantly faster and the speed gain increase the larger the list gets. Note: I have suppressed the output and I have only shown the last two elements of the "replaced" result as a check In[3]:= bigmap = Timing[ MapAt[# - 1 &, Range[1, 100000, 1], -1] ]; bigmap[[1]] {bigmap[[2, -2]], bigmap[[2, -1]]} bigreplace = Timing[ Range[1, 100000, 1] // ReplacePart[#, Last[#] - 1 , -1] & ]; bigreplace[[1]] {bigreplace[[2, -2]], bigreplace[[2, -1]]} Out[4]= 0.15 Second Out[5]= {99999, 99999} Out[7]= 0.01 Second Out[8]= {99999, 99999} In article <8r19qf$hvt at smc.vnet.net>, "Martin Rommel" <Martin_Rommel at mac.com> wrote: > I want to decrement the last number in list. This ought to be easy, but my > initial attempts did not bear fruits: > > In[40]:= > MapAt[Decrement, Range[116, 166, 8], -1] > > Decrement::"rvalue": "164 is not a variable with a value, so its value > cannot be changed." > > Out[40]= > {116, 124, 132, 140, 148, 156, 164--} > > Do I need to use ReplacePart? That works but still gives me an error! > > In[53]:= > Range[116, 166, 8] // ReplacePart[#, --Last[#], -1] & > > Set::"write": "Tag Last in Last[{116, 124, 132, 140, 148, 156, 164}] is > Protected." > > Out[53]= > {116, 124, 132, 140, 148, 156, 163} > > Different error here: > > In[51]:= > Range[116, 166, 8] // ReplacePart[#, --#[[-1]], -1] & > > Set::"setps": "{116, 124, 132, 140, 148, 156, 164} in assignment of part > is not a symbol." > > Out[51]= > {116, 124, 132, 140, 148, 156, 163} > > Anybody out there able to enlighten me? > > Thanks, Martin > > Sent via Deja.com http://www.deja.com/ Before you buy.