Mathematica降值Lhs

时间:2020-03-06 14:44:32  来源:igfitidea点击:

有人知道Mathematica中是否有内置函数来获取首付规则(没有任何保留)吗?我知道如何编写代码来做到这一点,但是对于内置的来说似乎已经足够基本了

例如:

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 &lt;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]

表示为所有后续呼叫缓存答案。