我有一个树(表达式),我只想收集某些类型的节点 - 那些遵循某种模式的节点。我在下面有一个简化的例子:
A = {{{{},{0.3,0.3}},{0.2,0.2}},{0.1,0.1}}; TreeForm[A, PlotRangePadding->0] Cases[A, {x_Real, y_Real}, Infinity]
输出:
这是一个很好的方法吗?
如果我要查找{{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}}
答案 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] ]