在列表中搜索某些三元组

时间:2011-09-22 17:14:39

标签: wolfram-mathematica

假设我们有一个{x,y,z} x类型的元素列表,yz整数。并且,如果需要x < y < z。 我们还假设该列表包含至少3个这样的三元组。

Mathematica可以轻松解决以下问题吗? 要检测{a,b,.}{b,c,.}{a,c,.}类型中的至少一个三元组? 我更喜欢优雅的1-liner而不是计算有效的解决方案。

4 个答案:

答案 0 :(得分:3)

如果我理解了这个问题,你想检测三元组并不一定是彼此跟随,而是通常出现在列表中的某个地方。这是检测所有这些三元组的一种方法。首先,一些测试清单:

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}}

以下是代码:

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}}}

这可能满足您的“单线”要求,但效率不高。如果你只需要跟随三元组,那么,作为@Chris给出的解决方案的替代方案,你可以做到

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

答案 1 :(得分:2)

我不知道我是否正确解释了您的问题,但假设您的列表类似于

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}}
*)

然后你可以做类似

的事情
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}}}
*)

请注意,这是有效的,因为对于原始列表中的任何元素{x,y,z},我们都有x<=y。因此,对于三{{a,b,_}, {a,c,_}, {b,c,_}} \[Subset] list我们知道a<=b<=c。这意味着{a,b,_}{a,c,_}{b,c,_}三个元素将在Sort[list]中以该顺序出现。

答案 2 :(得分:1)

匹配{a,b,。},{b,c,。}和{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_, _}}]

答案 3 :(得分:0)

(的被修改

(元组不是要走的路)

你需要这样的东西:

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

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

{{{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}}}

或者(正如其他人解释了这个问题):

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