从表达式中获取所有叶子

Cha*_*les 6 wolfram-mathematica symbolic-math

我想得到一个List(理想情况下是一组 - 丢弃重复 - 但假设没有直接的方法来执行此操作,我将只使用Union)来自给定表达式的叶子.

例如,表达式

ArcTan[(-1 + 2*x)/Sqrt[3]]/Sqrt[3]
Run Code Online (Sandbox Code Playgroud)

有一个LeafCount18:

  • -1(3)
  • 2(3)
  • 3(2)
  • X
  • 反正切
  • 功率(2)
  • 理性(2)
  • 时代(3)

所以我想要像

{-1, 2, 3, x, ArcTan, Plus, Power, Rational, Times}
Run Code Online (Sandbox Code Playgroud)

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

{ArcTan, Plus, Power, Rational, Times}
Run Code Online (Sandbox Code Playgroud)

这将是理想的 - 但是当我拥有它们时,可能会有一些不太困难的方法来过滤它们.

我有幸运气了

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

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

Bre*_*ion 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}
Run Code Online (Sandbox Code Playgroud)


Mr.*_*ard 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
Run Code Online (Sandbox Code Playgroud)
{-1, 2, 3, ArcTan, Plus, Power, Rational, Times, x}

Brett Champion的方法更精简,但我会改变一点:

Union@Cases[expr, h_[___] :> h, {0, -1}]
Run Code Online (Sandbox Code Playgroud)

这样你就可以获得一个顶级头部,例如ArcTan:

expr = ArcTan[(-1 + 2*x)/Sqrt[3]];
Run Code Online (Sandbox Code Playgroud)


Dan*_*lau 6

对于原始问题,可以通过等级获得所有叶子,等级规格为{-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}
Run Code Online (Sandbox Code Playgroud)

Daniel Lichtblau