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 <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]
表示为所有后续呼叫缓存答案。