Re: Summary: List element manipulation
- To: mathgroup at smc.vnet.net
- Subject: [mg25469] Re: Summary: List element manipulation
- From: "Allan Hayes" <hay at haystack.demon.co.uk>
- Date: Mon, 2 Oct 2000 22:26:50 -0400 (EDT)
- References: <8r19qf$hvt@smc.vnet.net> <8r6oij$1c@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Martin, Here are some timings and a new method that is faster on the tests below, but which is adversely affected when the structure of the data is more complicated than a list of numbers. data1 = Range[1000000]; Previous methods MapAt[# - 1 &, data1, -1]; // Timing // First 7.91 Second data1 /. {h___, t_} -> {h, t - 1}; // Timing // First 8.73 Second New method oneOffLast[x_] := Module[{y = x}, y[[-1]] = y[[-1]] - 1; y] oneOffLast[data1]; // Timing // First 0.44 Second We could use an anonymous function: Module[{y = #}, y[[-1]] = y[[-1]] - 1; y] &[data1] // Timing // First 0.43 Second Slightly more complicated data data2 = Prepend[Range[1000000], {0}]; The previous methods are slightly affected: MapAt[# - 1 &, data2, -1]; // Timing // First 4.01 Second data2 /. {h___, t_} -> {h, t - 1}; // Timing // First 6.26 Second The new one is much slower on data2 than on data1(though still faster than the previous methods. oneOffLast[data2]; // Timing // First 2.14 Second Introducing a symbol has much the same adverse effect on the new method : Remove[a] data3 = Prepend[Range[1000000], a]; oneOffLast[data3]; // Timing // First 2.69 Second -- Allan --------------------- Allan Hayes Mathematica Training and Consulting Leicester UK www.haystack.demon.co.uk hay at haystack.demon.co.uk Voice: +44 (0)116 271 4198 Fax: +44 (0)870 164 0565 "Martin Rommel" <rommel at semitest.com> wrote in message news:8r6oij$1c at smc.vnet.net... > Thanks to the many helpful people that replied with their insight. > The straightforward fix to my problematic > > > MapAt[Decrement, Range[116, 166, 8], -1] > > > > Decrement::"rvalue": "164 is not a variable with a value, so its value > > cannot be changed." > > is using a function # - 1& instead of Decrement (which is not a mathematical > function but instead listed under programming assignments in the help > browser) > > MapAt[# - 1&, Range[116, 166, 8], -1] > > This was suggested by the news group veterans David Park, Andrzej Kozlowski, > Hartmut Wolf and Allan Hayes. > > Matt Johnson suggested an alternative using a rule (it is always interesting > to see things done differently) > > Range[116, 166, 8] /. {h___, t_} -> {h, t - 1} > > Special thanks to Andrzej Kozlowski for additonal explainations but the most > in depth coverage came from my compatriot Hartmut Wolf. > > With hindsight I don't understand why I was so fixated on employing > Decrement. > > Martin > >