这就像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]
它表示缓存所有后续调用的答案。