exchanging 2 elements in a list
- To: mathgroup at smc.vnet.net
- Subject: [mg27578] exchanging 2 elements in a list
- From: Richard Fateman <fateman at cs.berkeley.edu>
- Date: Wed, 7 Mar 2001 04:08:29 -0500 (EST)
- Organization: University of California, Berkeley
- Sender: owner-wri-mathgroup at wolfram.com
Actually, I wanted to exchange 2 rows in a matrix, but writing this program I found I could not even exchange 2 elements in a simple list by the first two (most obvious) programs I wrote. The third works. So does the fourth. Anyone care to explain why the first 2 fail? (Typing them in to a system does not really explain that much.) try Exchangitems[{a,b,c,d,e,f},2,4] which should result in {a,d,c,b,e,f}. Naturally it should not SET any of the variables a,b,c,... . version 2 sets b to the value d. Exchangeitems1[m_,r_Integer,s_Integer]:= Block[{temp=m[[r]]}, m[[r]]=m[[s]]; m[[s]]=temp; m]; Exchangeitems2[m_,r_Integer,s_Integer]:= Block[{temp}, temp=m[[r]]; m=ReplacePart[m,m[[s]],{r}]; m=ReplacePart[m,temp,{s}]; m]; (* this works by adding a useless variable *) Exchangeitems[k_,r_Integer,s_Integer]:= Block[{m,temp}, m=k; temp=m[[r]]; m=ReplacePart[m,m[[s]],{r}]; m=ReplacePart[m,temp,{s}]; m]; (*Here is a more "functional" version *) ei[k_, low_, hi_]:= ei[k,hi,low] /; low>hi; ei[k_, low_, hi_]:= k /; low==hi; ei[k_, low_, hi_] := Flatten[{Take[k, {1, low - 1}], {k[[hi]]}, Take[k, {low + 1, hi - 1}], {k[[low]]}, Drop[k, hi]}, 1]; (*and here is an APL-style version*) ei2[k_,r_,s_]:=Table[Switch[j,r,k[[s]], s,k[[r]], _,k[[j]]], {j,1,Length[k]}]; Is there a nice, efficient, (and correct) program to do this? Perhaps there is a better way to do this