有没有人知道Mathematica中是否有内置函数来获取低值规则的lhs(没有任何持有)?我知道如何编写代码来实现它,但对于内置的

来说它似乎已经足够了

例如:

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

BuiltInIDoNotKnowOf [a] 返回 {1,2}

有帮助吗?

解决方案

这似乎有效;但不确定它有多大用处:

a[1] = 2
a[2] = 3
a[3] = 5
a[6] = 8
Part[DownValues[a], All, 1, 1, 1]

其他提示

这类似于Perl和Python中的 keys()以及内置支持哈希(又名词典)的其他语言。如您的示例所示,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] 获取哈希值。)如果您想允许更高的arity哈希值,例如 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]]&;

有趣的是, DownValues 文档中没有提及 Sort 选项。我从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]

表示缓存所有后续调用的答案。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top