Mathematica - 有选择地收集树中的节点

时间:2011-07-11 14:24:31

标签: wolfram-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

这是一个很好的方法吗?

如果我要查找{{x1_,y1_},{x2_,y_2}}而不是{x_,y_},那么如何排除{x_,y_}之类的表达式,它们也匹配?

此致

编辑(2011年7月14日)

我发现使用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}}

2 个答案:

答案 0 :(得分: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,但任何数字都可以)?

答案 1 :(得分: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] ]