选择性地收集树中的节点
我有一棵树(表达式),我只想收集某些类型的节点 - 那些遵循某种模式的节点。 我有一个简化的例子如下:
A = {{{{},{0.3,0.3}},{0.2,0.2}},{0.1,0.1}}; TreeForm[A, PlotRangePadding->0] Cases[A, {x_Real, y_Real}, Infinity]
输出:
这是做这件事的好方法吗?
如果不是{x_,y_},如果我想查找{{x1_,y1_},{x2_,y_2}},我该如何排除像{x_,y_}这样的表达式,它们也匹配?
问候
编辑(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}}
关于你的问题的第二部分,即选择{{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
但任何数字都可以)?
这里是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] ]
链接地址: http://www.djcxy.com/p/35579.html