列出定义了`data [i_Integer]`的所有`i`

时间:2012-08-28 15:35:27

标签: wolfram-mathematica

我正在阅读一个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";并假设可以选择上限。它也会很慢并浪费内存。

2 个答案:

答案 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}