Or in a Select question
- To: mathgroup at smc.vnet.net
- Subject: [mg67066] Or in a Select question
- From: János <janos.lobb at yale.edu>
- Date: Thu, 8 Jun 2006 04:54:07 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Hi, I have a list lst={a,b,c} I make another list from it the following way: In[2]:= pp = Partition[Tuples[lst, 2], 2, 1] Out[2]= {{{a, a}, {a, b}}, {{a, b}, {a, c}}, {{a, c}, {b, a}}, {{b, a}, {b, b}}, {{b, b}, {b, c}}, {{b, c}, {c, a}}, {{c, a}, {c, b}}, {{c, b}, {c, c}}} From here I would like to select all the elements whose sublists contain only different elements. So my "logical" selection was: In[54]:= Select[pp, #1[[1,1]] =!= #1[[1,2]] || #1[[2,1]] =!= #1[[2, 2]] & ] Out[54]= {{{a, a}, {a, b}}, {{a, b}, {a, c}}, {{a, c}, {b, a}}, {{b, a}, {b, b}}, {{b, b}, {b, c}}, {{b, c}, {c, a}}, {{c, a}, {c, b}}, {{c, b}, {c, c}}} Well, that did not do any damage to the list. After some time I came up with this one: In[49]:= Complement[pp, Select[pp, Xor[#1[[1,1]] =!= #1[[1,2]], #1[[2,1]] =!= #1[[2, 2]]] & ]] Out[49]= {{{a, b}, {a, c}}, {{a, c}, {b, a}}, {{b, c}, {c, a}}, {{c, a}, {c, b}}} That looks OK, but also looks too complicated. Why my "logical" one does not work here? Interestingly if I just use either the left or right side of the Or, that partial select is working. For example: In[65]:= Select[pp, #1[[1,1]] =!= #1[[1,2]] & ] Out[65]= {{{a, b}, {a, c}}, {{a, c}, {b, a}}, {{b, a}, {b, b}}, {{b, c}, {c, a}}, {{c, a}, {c, b}}, {{c, b}, {c, c}}} Now if I try with Cases and conditional pattern matching then the selection for sublists with identical elements works: In[98]:= Cases[pp, {u_, v_} /; u[[1]] === u[[2]] || v[[1]] === v[[2]]] Out[98]= {{{a, a}, {a, b}}, {{b, a}, {b, b}}, {{b, b}, {b, c}}, {{c, b}, {c, c}}} If I change here the === to =!=, then I do not get again that I expect: In[103]:= Cases[pp, (({u_, v_} /; u[[1]]) =!= u[[2]] || v[[1]]) =!= v[[2]]] From In[103]:= \!\(\* RowBox[{\(Part::"partd"\), ":", "\<\"Part specification \\!\\(u \[LeftDoubleBracket] 2 \ \[RightDoubleBracket]\\) is longer than depth of object. \ \\!\\(\\*ButtonBox[\\\"More\[Ellipsis]\\\", ButtonStyle->\\ \"RefGuideLinkText\ \\\", ButtonFrame->None, ButtonData:>\\\"General::partd\\\"]\\)\"\>"}]\) From In[103]:= \!\(\* RowBox[{\(Part::"partd"\), ":", "\<\"Part specification \\!\\(v \[LeftDoubleBracket] 2 \ \[RightDoubleBracket]\\) is longer than depth of object. \ \\!\\(\\*ButtonBox[\\\"More\[Ellipsis]\\\", ButtonStyle->\\ \"RefGuideLinkText\ \\\", ButtonFrame->None, ButtonData:>\\\"General::partd\\\"]\\)\"\>"}]\) Out[103]= {} From In[104]:= Part::"partd":"Part specification \!\(u \[LeftDoubleBracket] 2 \ \[RightDoubleBracket]\) is longer than depth of object. \ \!\(\*ButtonBox[\"More\[Ellipsis]\", ButtonStyle->\"RefGuideLinkText \", \ ButtonFrame->None, ButtonData:>\"General::partd\"]\)" From In[104]:= Part::"partd":"Part specification \!\(v \[LeftDoubleBracket] 2 \ \[RightDoubleBracket]\) is longer than depth of object. \ \!\(\*ButtonBox[\"More\[Ellipsis]\", ButtonStyle->\"RefGuideLinkText \", \ ButtonFrame->None, ButtonData:>\"General::partd\"]\)" if I change =!= to only != then I still do not get that I expect: In[108]:= Cases[pp, {u_, v_} /; u[[1]] != u[[2]] || v[[1]] != v[[2]]] Out[108]= {} Obviously I am not GETting something here :) Thanks ahead, János P.S. It is 5.1 on OSX 10.4.6. I know that Or evaluates in a non- traditional way and looked the Appendix - that is how I ended up with Xor. ---------------------------------------------- Trying to argue with a politician is like lifting up the head of a corpse. (S. Lem: His Master Voice)
- Follow-Ups:
- Re: Or in a Select question
- From: bsyehuda@gmail.com
- Re: Or in a Select question
- From: ggroup@sarj.ca
- Re: Or in a Select question
- From: "Carl K. Woll" <carlw@wolfram.com>
- Re: Or in a Select question