Mathematica 9 is now available
Services & Resources / Wolfram Forums / MathGroup Archive
-----

MathGroup Archive 2008

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: Match Pairs of Numbers

  • To: mathgroup at smc.vnet.net
  • Subject: [mg86907] Re: Match Pairs of Numbers
  • From: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>
  • Date: Wed, 26 Mar 2008 04:48:47 -0500 (EST)
  • Organization: The Open University, Milton Keynes, UK
  • References: <fsa5bn$aae$1@smc.vnet.net>

Andrew Beveridge wrote:

> I am having trouble finding the correct form of Pattern Matching for 
> pairs of Numbers. I do not know whether to use Select, Cases, Pick, 
> etc. I am also unsure how to set the pattern matching argument.
> 
> Assume I have the list
> 
> lst = {{1,1}, {1,2}, {1,3}, {1,4}, {2,2}, {3,1}, {3,2}, {3,3}, {4,1}, {4,4}}
> 
> 
> I would like to match/select pairs that have the same set of numbers 
> only reversed, that is, the selection would find
> 
> {{1,3}, {3,1}, {1,4}, {4,1} }

The following examples should help you started. Note that they have not 
been optimized for speed, though the recursive example (myComp) is much 
faster than the first one (which try to illustrate how to use Pick).

Also, note that the best strategy to solve the problem depends on many 
factors you did not mention, such as the size of the list, possibility 
of many occurrences of matching pairs (say, several {1,4}'s), whether 
the order of the matching pairs returned in the solution is important, etc.


lst = {{1,1},{1,2},{1,3},{1,4},{2,2},{3,1},{3,2},{3,3},{4,1},{4,4}};

myCheck[lst_List] :=
  Module[{rev = Reverse /@ lst},
   Flatten[Table[
      Pick[lst, MapThread[SameQ, {lst, RotateLeft[rev, n]}]], {n,
       Length@lst - 1}] /. {} -> Sequence[], 1]]

myCheck[lst]

(* ==> {{1, 3}, {1, 4}, {4, 1}, {3, 1}} *)

myComp[data_List] :=
  Module[{mySearch},
   mySearch[pair_List, lst_List /; Length[lst] > 0] :=

    Union[Cases[Reverse /@ lst, pair], mySearch[First@lst, Rest@lst]];
   mySearch[pair_List, lst_List] := {};
   Block[{$RecursionLimit = 10 + Length@data},
    mySearch[First@lst, Rest@lst]
    ]
   ]

myComp[lst]

(* ==> {{1, 3}, {1, 4}} *)


Regards,
-- 
Jean-Marc


  • Prev by Date: Re: Basic plotting of an evaluated function
  • Next by Date: Re: Intersection of 2D Surfaces in 3D
  • Previous by thread: Re: Match Pairs of Numbers
  • Next by thread: Hide a PopupMenu in Manipulate