2011-07-11 92 views
2

我有一棵樹(表達式),我只想收集某些類型的節點 - 那些節點遵循某種模式。下面我有一個簡單的例子:Mathematica - 選擇性地收集樹中的節點

 
A = {{{{},{0.3,0.3}},{0.2,0.2}},{0.1,0.1}}; 
TreeForm[A, PlotRangePadding->0] 
Cases[A, {x_Real, y_Real}, Infinity] 

輸出:

enter image description here

這是一個好辦法做到這一點?

如果不是{X_,Y_},如果我想尋找{{x1_,y1_},{x2_,Y_2}},我怎麼能排除這樣的表達式{X_,Y_},這也匹配嗎?

問候

EDIT(14/07/2011)

我已經發現,使用比其它List的頭部會在找到這樣的子表達式無衝突極大地幫助。

例如,重整以上:

A = {{{{}, pt[0.3, 0.3]}, pt[0.2, 0.2]}, pt[0.1, 0.1]}; 
List @@@ Cases[A, _pt, Infinity] 

輸出:

{{0.3,0.3},{0.2,0.2},{0.1,0.1}} 

回答

3

關於你問題的第二部分,即選擇{{a,b},{c,d}},怎麼樣

b = {{{{}, {0.3, 0.3}}, {0.2, 0.2}}, {{0.1, 0.1}, {0.3, 0.4}}}; 
TreeForm[b] 
Cases[b, {{a_, b_}, {c_, d_}} /; (And @@ NumericQ /@ {a, b, c, d}), Infinity] 

(所以他們不必是Real但任何數字會做)?

+0

感謝NumericQ的想法。我在另一個地方使用了x_Real | x_Integer模式,我將替換它。 –

1

這裏是acl使用的替代形式,我發現更具可讀性。

b = {{{{}, {0.3, 0.3}}, {0.2, 0.2}}, {{0.1, 0.1}, {0.3, 0.4}}}; 

With[{p = _?NumericQ}, Cases[b, {{p, p}, {p, p}}, -1] ] 
+0

+1。這是一個很好的觀點:我在答案中寫的代碼現在很難在思維上解析。 – acl

相關問題