6

与えられた式から葉のList(理想的にはセット-繰り返しを破棄します-しかし、これを行う直接的な方法がないと仮定して、私は使用します)を取得したいと思います。Union

たとえば、式

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

LeafCount18のを持っています:

  • -1(3)
  • 2(3)
  • 3(2)
  • バツ
  • ArcTan
  • プラス
  • パワー(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

元の質問では、レベル仕様が{-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}

その後、簡単に削除できIntegerますSymbol


編集:

次に、式をリストでラップして、最上位のヘッドを取得していることを確認しましょう。(元の表現はTimes頭にありましたが、中には2回もありました。

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

TreeForm

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