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