10

Does anybody know if there is a built-in function in Mathematica for getting the lhs of downvalue rules (without any holding)? I know how to write the code to do it, but it seems basic enough for a built-in

For example:

a[1]=2;
a[2]=3;

BuiltInIDoNotKnowOf[a] returns {1,2}

4

2 に答える 2

22

これはkeys()、ハッシュ (別名辞書) のサポートが組み込まれている Perl や Python などの言語と似ています。あなたの例が示すように、 Mathematica は特別な構文なしでハッシュをサポートします。言うだけa[1] = 2で、ハッシュが得られます。[1] ハッシュのキーを取得するには、これを init.m または個人のユーティリティ ライブラリに追加することをお勧めします。

keys[f_] := DownValues[f][[All,1,1,1]]  (* Keys of a hash/dictionary. *)

(または、次の純粋関数バージョンはおそらくわずかに高速です。

keys = DownValues[#][[All,1,1,1]]&;     (* Keys of a hash/dictionary. *)

)

いずれにせよ、keys[a]今はあなたが望むものを返します。(ハッシュの値は で取得できますa /@ keys[a]。) より高いアリティのハッシュを許可する場合は、次のようa[1,2]=5; a[3,4]=6に使用できます。

SetAttributes[removeHead, {HoldAll}];
removeHead[h_[args___]] := {args}
keys[f_] := removeHead @@@ DownValues[f][[All,1]]

を返します{{1,2}, {3,4}}。(その場合、ハッシュ値は で取得できますa @@@ keys[a]。)

デフォルトではキーをソートすることに注意してくださいDownValues。せいぜい余分な時間がかかるため、これはおそらく良い考えではありません。キーをソートしたい場合は、Sort@keys[f]. だから私は実際にこのバージョンをお勧めします:

keys = DownValues[#,Sort->False][[All,1,1,1]]&;

興味深いことに、ドキュメントにはSortオプションについての言及がありませんDownValues。これについては、Wolfram Research の Daniel Lichtblau の古い投稿から知りました。(現バージョン(7.0)のMathematicaでも動作することを確認しました。)


脚注:

[1] 本当に便利なのは、それを関数定義と組み合わせて使用​​できることです。お気に入り:

fib[0] = 1;
fib[1] = 1;
fib[n_] := fib[n-1] + fib[n-2]

最後の行を次のように変更することで、メモ化を追加できます。

fib[n_] := fib[n] = fib[n-1] + fib[n-2]

これは、後続のすべての呼び出しの回答をキャッシュすることを示しています。

于 2008-09-30T19:58:11.690 に答える
9

これはうまくいくようです。ただし、それがどれほど役立つかはわかりません。

a[1] = 2
a[2] = 3
a[3] = 5
a[6] = 8
Part[DownValues[a], All, 1, 1, 1]
于 2008-09-26T06:28:02.943 に答える