6

我想从给定的表达式中得到一个List(理想情况下是一组 - 丢弃重复 - 但假设没有直接的方法可以做到这一点,我将只使用Union)叶子。

例如,表达式

ArcTan[(-1 + 2*x)/Sqrt[3]]/Sqrt[3]

LeafCount18 个:

  • -1 (3)
  • 2 (3)
  • 3 (2)
  • X
  • 弧棕
  • 电源 (2)
  • 理性 (2)
  • 时代 (3)

所以我想要类似的东西

{-1, 2, 3, x, ArcTan, Plus, Power, Rational, Times}

实际上,我真的只是想要这些功能

{ArcTan, Plus, Power, Rational, Times}

会是理想的——但是当我拥有它们时,大概有一些不太难的方法来过滤它们。

我有一些运气

H[s_] := If[LeafCount[s] == 1, s, Head[s]]
H /@ Level[expr, 1, Heads -> True]
H /@ Level[expr, 2, Heads -> True]
(* ... *)

但我觉得必须有更好的方法。

4

4 回答 4

8

你可以用Cases这个:

In[176]:= 
Cases[ArcTan[(-1 + 2*x)/Sqrt[3]]/Sqrt[3], h_[___] :> h, 
  {0,Infinity}] // DeleteDuplicates

Out[176]= {Rational, Power, Times, Plus, ArcTan}
于 2011-08-18T20:43:00.620 回答
7

您自己的解决方案似乎还不错:

expr = ArcTan[(-1 + 2*x)/Sqrt[3]]/Sqrt[3];

H[s_] := If[LeafCount[s] == 1, s, Head[s]]

H /@ Level[exp, -1, Heads -> True] // Union
{-1, 2, 3, ArcTan, Plus, Power, Rational, Times, x}

Brett Champion 的方法更加精简,但我会稍微改变一下:

Union@Cases[expr, h_[___] :> h, {0, -1}]

通过这种方式,您可以获得顶级头部,例如ArcTan

expr = ArcTan[(-1 + 2*x)/Sqrt[3]];
于 2011-08-18T21:03:11.880 回答
6

对于最初的问题,可以通过 Level 获得所有叶子,级别规范为 {-1} 并允许正面。

In[87]:= Level[ArcTan[(-1 + 2*x)/Sqrt[3]]/Sqrt[3], {-1}, Heads -> True]

Out[87]= {Times, Power, 3, -(1/2), ArcTan, Times, Power, 3, -(1/
    2), Plus, -1, Times, 2, x}

丹尼尔·利赫特布劳

于 2011-08-18T21:04:02.950 回答
4

这就是我想出的...

In[92]:= f[e_] := DeleteDuplicates[Prepend[Head[#] & /@ Level[e, Depth[e]], Head[e]]]

In[93]:= f[ArcTan[(-1 + 2*x)/Sqrt[3]]/Sqrt[3]]

Out[93]=  {Times, Integer, Rational, Power, Symbol, Plus, ArcTan}

然后,您可以轻松删除IntegerSymbol


编辑:

现在让我们将表达式包装在一个列表中,以确保我们得到最上面的头部。(原来的表情Times是头部,但里面也是两次。

In[139]:= a = {ArcTan[(-1 + 2*x)/Sqrt[3]]/Sqrt[3]}
In[140]:= TreeForm[a, AspectRatio -> .7]

树形

In[142]:= f[a]
Out[142]= {List, Integer, Rational, Power, Symbol, Times, Plus, ArcTan}
于 2011-08-18T21:47:35.303 回答