RE: Assigning to a sublist
- To: mathgroup at smc.vnet.net
- Subject: [mg35175] RE: [mg35161] Assigning to a sublist
- From: "Wolf, Hartmut" <Hartmut.Wolf at t-systems.com>
- Date: Fri, 28 Jun 2002 02:31:08 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
> -----Original Message----- > From: Wolf, Hartmut To: mathgroup at smc.vnet.net > Sent: Thursday, June 27, 2002 9:46 AM > Subject: [mg35175] RE: [mg35161] Assigning to a sublist > > > > > -----Original Message----- > > From: Bob Harris [mailto:nitlion at mindspring.com] To: mathgroup at smc.vnet.net > > Sent: Thursday, June 27, 2002 6:24 AM > > To: mathgroup at smc.vnet.net > > Subject: [mg35175] [mg35161] Assigning to a sublist > > > > > > Howdy, > > > > I'm trying to assign a new value to an entry in a sublist (of > > another list), > > and I can't understand why it won't work. > > > > For example, I do the following: > > > > In[1]:= zz = {{2, {{1, 1}}}, {10, {{3, 1}}}, {5, {{2, 1}}}} > > Out[1]= {{2, {{1, 1}}}, {10, {{3, 1}}}, {5, {{2, 1}}}} > > > > In[2]:= zz[[3]][[2]] > > Out[2]= {{2, 1}} > > > > In[3]:= Append[zz[[3]][[2]], {1, 1, 1, 1, 1}] > > Out[3]= {{2, 1}, {1, 1, 1, 1, 1}} > > > > In[4]:= zz[[3]][[2]] = Append[zz[[3]][[2]], {1, 1, 1, 1, 1}] > > Set::"setps : zz[[3]] in assignment of part is not a symbol." > > Out[4]= {{2, 1}, {1, 1, 1, 1, 1}} > > > > For some reason it doesn't like the assignment. What > > confuses me is that is > > zz[[3]][[2]] were just a variable, it would work. Further, > > if it were just > > an entry at the *top* level of a list, it would work, as this > > example shows: > > > > In[5]:= yy = zz[[3]] > > Out[5]= {5, {{2, 1}}} > > > > In[6]:= yy[[2]] > > Out[6]= {{2, 1}} > > > > In[7]:= yy[[2]] = Append[yy[[2]], {1, 1, 1, 1, 1}] > > Out[7]= {{2, 1}, {1, 1, 1, 1, 1}} > > > > So it seems like the issue is just that deeply nested things > > don't behave > > like things that are not as deeply nested. Am I right about > > that? How can > > I modify an entry in a sublist? > > > > Thanks, > > Bob H > > > > > > Bob, > > observe > > In[1]:= zz = {{2, {{1, 1}}}, {10, {{3, 1}}}, {5, {{2, 1}}}} > Out[1]= {{2, {{1, 1}}}, {10, {{3, 1}}}, {5, {{2, 1}}}} > > In[2]:= zz[[3, 2]] = Append[zz[[3]][[2]], {1, 1, 1, 1, 1}] > Out[2]= {{2, 1}, {1, 1, 1, 1, 1}} > > In[3]:= zz > Out[3]= > {{2, {{1, 1}}}, {10, {{3, 1}}}, {5, {{2, 1}, {1, 1, 1, 1, 1}}}} > > So here at the lhs of Set zz[[3]][[2]] is not the same as zz[[3, 2]] > > In[4]:= Hold[zz[[3]][[2]]] // FullForm > Out[4]//FullForm= Hold[Part[Part[zz, 3], 2]] > > In[5]:= Hold[zz[[3, 2]]] // FullForm > Out[5]//FullForm= Hold[Part[zz, 3, 2]] > > Set looks at the first element of Part at the (unevaluated) > lhs, this must be a symbol, and zz[[3]] is none, as the error > message tells. Set does not look down further, clearly on > reasons of performance. So just use simple (flat) Part. > > -- > Hartmut > An additional remark: Although not needed in any way, (and let's forget Function, With, Replace etc. for a while) it might be an interesting question how to flatten Part at the lhs of Set. I found this way: In[62]:= zz = {{2, {{1, 1}}}, {10, {{3, 1}}}, {5, {{2, 1}}}} Out[62]= {{2, {{1, 1}}}, {10, {{3, 1}}}, {5, {{2, 1}}}} In[63]:= Block[{Set, Part, Append, zz}, Flatten[zz[[3]][[2]], 2, Part] = Append[zz[[3]][[2]], {1, 1, 1, 1, 1}]] Out[63]= {{2, 1}, {1, 1, 1, 1, 1}} In[64]:= zz Out[64]= {{2, {{1, 1}}}, {10, {{3, 1}}}, {5, {{2, 1}, {1, 1, 1, 1, 1}}}} -- Hartmut