我們假設我們有一個類型的元素列表,其中x
,y
, 和z
整數。並且,如果需要x < y < z
。我們還假定列表包含至少3個這樣的三元組。在列表中搜索某些三元組
Mathematica能否輕鬆解決以下問題? 要檢測至少一個{a,b,.}
,{b,c,.}
和{a,c,.}
類型的三元組? 我比高效計算解決方案更適合優雅的單線。
我們假設我們有一個類型的元素列表,其中x
,y
, 和z
整數。並且,如果需要x < y < z
。我們還假定列表包含至少3個這樣的三元組。在列表中搜索某些三元組
Mathematica能否輕鬆解決以下問題? 要檢測至少一個{a,b,.}
,{b,c,.}
和{a,c,.}
類型的三元組? 我比高效計算解決方案更適合優雅的單線。
要匹配 「類型{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_, _}}]
如果我的理解這個問題,你想要檢測不一定跟隨另一個三元組,但通常在列表中的某處。這是檢測所有這些三元組的一種方法。首先,一些測試列表:
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}}}
這或許可以滿足你「的一行」的要求,但也不是很有效的。如果你只需要三倍以下彼此,然後,以替代由@克里斯給出的解決方案,你可以做
ReplaceList[list,
{___, seq : PatternSequence[{a_, b_, _}, {b_, c_, _}, {a_,c_, _}], ___} :> {seq}]
(編輯)
(元組是不是要走的路)
你需要這樣的:
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_, _}}];
我不知道如果我正確地解釋你的問題,但假設你的列表是一樣的東西
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]
的順序出現。
我沒有實現你的版本,因爲從OP的表述中不清楚條件(不平等)是否實際執行。除此之外,我不明白你的答案與我的不同。 –
我不完全理解你是什麼意思'檢測至少一個類型{a,b ,.},{b,c ,.}和{a,c ,.}的三元組? ' –
請解釋「如果需要」中的「如果需要x
DavidC