开发者

Searching for certain triples in a list

Let’s assume we have a list of elements of the type {x,y,z} for x, y and z integers. And, if needed x < y < z. We also assume that the list contains at least 3 such triples.

Can Mathematica easily solve the following problem? To detect at least one triple of the type {a,b,.}, {b,c,.} and {a,c,.}? I am 开发者_JAVA百科more intereseted in an elegant 1-liner than computational efficient solutions.


If I understood the problem, you want to detect triples not necessarily following one another, but generally present somewhere in the list. Here is one way to detect all such triples. First, some test list:

In[71]:= tst = RandomInteger[5,{10,3}]
Out[71]= {{1,1,0},{1,3,5},{3,3,4},{1,2,1},{2,0,3},{2,5,1},{4,2,2},
           {4,3,4},{1,4,2},{4,4,3}}

Here is the code:

In[73]:= 
Apply[Join,ReplaceList[tst,{___,#1,___,#2,___,#3,___}:>{fst,sec,th}]&@@@
    Permutations[{fst:{a_,b_,_},sec:{b_,c_,_},th:{a_,c_,_}}]]

Out[73]= {{{1,4,2},{4,3,4},{1,3,5}},{{1,4,2},{4,2,2},{1,2,1}}}

This may perhaps satisfy your "one-liner" requirement, but is not very efficient. If you need only triples following one another, then, as an alternative to solution given by @Chris, you can do

ReplaceList[list, 
    {___, seq : PatternSequence[{a_, b_, _}, {b_, c_, _}, {a_,c_, _}], ___} :> {seq}]


I don't know if I interpreted your question correctly but suppose your list is something like

list = Sort /@ RandomInteger[10, {20, 3}]

(*
 {{3, 9, 9}, {0, 5, 6}, {3, 4, 8}, {4, 6, 10}, {3, 6, 9}, {1, 4, 8}, 
  {0, 6, 10}, {2, 9, 10}, {3, 5, 9}, {6, 7, 9}, {0, 9, 10}, {1, 7, 10}, 
  {4, 5, 10}, {0, 2, 5}, {0, 6, 7}, {1, 8, 10}, {1, 8, 10}}
*)

then you could do something like

ReplaceList[Sort[list], 
 {___, p:{a_, b_, _}, ___, q:{a_, c_, _}, ___, r:{b_, c_, _}, ___} :> {p, q, r}]

(* Output:
 {{{0, 2, 5}, {0, 9, 10}, {2, 9, 10}}, {{3, 4, 8}, {3, 5, 9}, 
  {4, 5, 10}}, {{3, 4, 8}, {3, 6, 9}, {4, 6, 10}}}
*)

Note that this works since it is given that for any element {x,y,z} in the original list we have x<=y. Therefore, for a triple {{a,b,_}, {a,c,_}, {b,c,_}} \[Subset] list we know that a<=b<=c. This means that the three elements {a,b,_}, {a,c,_}, and {b,c,_} will appear in that order in Sort[list].


To match triples "of the type {a,b,.}, {b,c,.} and {a,c,.}":

list = {{34, 37, 8}, {74, 32, 65}, {48, 77, 18}, {77, 100, 30},
        {48, 100, 13}, {100, 94, 55}, {48, 94, 73}, {77, 28, 12},
        {90, 91, 51}, {34, 5, 32}};

Cases[Partition[list, 3, 1], {{a_, b_, _}, {b_, c_, _}, {a_, c_, _}}]


(Edited)

(Tuples was not the way to go)

Do you require something like:

list = RandomInteger[10, {50, 3}];

Cases[Permutations[
  list, {3}], {{a_, b_, _}, {b_, c_, _}, {a_, c_, _}} /; a < b < c]

giving

{{{0, 1, 2}, {1, 5, 2}, {0, 5, 4}}, 
{{2, 3, 5},{3, 4, 10}, {2, 4, 5}}, 
{{6, 8, 10}, {8, 10, 10},{6, 10, 0}}, 
{{2, 4, 5}, {4, 8, 2}, {2, 8, 5}}, 
{{2, 4, 5}, {4, 7, 7}, {2, 7, 3}}, 
{{0, 2, 2}, {2, 7, 3}, {0, 7, 2}}, 
{{0, 2, 1}, {2, 7, 3}, {0, 7, 2}}}

or perhaps (as other have interpreted the question):

Cases[Permutations[
   list, {3}], {{a_, b_, _}, {b_, c_, _}, {a_, c_, _}}];
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜