10

有谁知道 Mathematica 中是否有一个内置函数来获取降值规则的 lhs(没有任何持有)?我知道如何编写代码来做到这一点,但对于内置

例如:

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

BuiltInIDoNotKnowOf[a]返回{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 的一篇旧帖子中了解到的。(我确认它在 Mathematica 的当前版本(7.0)中仍然有效。)


脚注:

[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 回答