0

我正在读取一个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";如果我们删除整数下标要求)并假设可以选择一个上限。它也会很慢并浪费内存。

4

2 回答 2

4

我仍然不在我的 Mathematica 机器上,但我DownValues[data]突然想到可能会返回一个规则列表,您可能很乐意操纵这些规则来摆脱is. 也许是这样的;

Cases[DownValues[data],RuleDelayed[HoldPattern[data[i_Integer]],rhs_]:>i]
于 2012-08-28T16:15:01.760 回答
0
data[1] = {stuff};
data[5] = {otherStuff};
data[99] = {yetMoreStuff};

Cases[
 DownValues @ data,
 _[_@_@x_Integer, _] :> x
]
{1, 5, 99}
于 2012-09-15T12:54:33.043 回答