我正在阅读一个Get[]
的文件,其中包含一个分号分隔的子脚本定义序列,如下所示:
data[1] = {stuff};
data[5] = {otherStuff};
data[99] = {yetMoreStuff};
以编程方式决定i
定义data[i]
的最简洁方法是什么?索引列表会很好,例如{1, 5, 99}
。
一种hacky方式是循环遍历可能值的范围,以查看哪些没有头部“数据”(例如Select[data/@Range[1,1000],(Not[MatchQ[#,_data]])?]
),但这不具有吸引力,因为它不是通用的(例如它如果我们删除整数下标要求,则不会找到data[dog] = "Max";
并假设可以选择上限。它也会很慢并浪费内存。
答案 0 :(得分:4)
我仍然不在我的Mathematica机器上,但我发现DownValues[data]
可能会返回一个规则列表,您可能乐于操纵以获取i
。也许是这样的事情;
Cases[DownValues[data],RuleDelayed[HoldPattern[data[i_Integer]],rhs_]:>i]
答案 1 :(得分:0)
data[1] = {stuff};
data[5] = {otherStuff};
data[99] = {yetMoreStuff};
Cases[
DownValues @ data,
_[_@_@x_Integer, _] :> x
]
{1, 5, 99}