假设我们有一个{x,y,z}
x
类型的元素列表,y
和z
整数。并且,如果需要x < y < z
。
我们还假设该列表包含至少3个这样的三元组。
Mathematica可以轻松解决以下问题吗?
要检测{a,b,.}
,{b,c,.}
和{a,c,.}
类型中的至少一个三元组?
我更喜欢优雅的1-liner而不是计算有效的解决方案。
答案 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_, _}}];