0

私はGet[]次のようなサブスクリプト定義のセミコロンで区切られたシーケンスを含むファイルを読んでいます:

data[1] = {stuff};
data[5] = {otherStuff};
data[99] = {yetMoreStuff};

定義されてiいる値をプログラムで決定するための最もクリーンな方法は何ですか?data[i]インデックスのリストはいいでしょう、例えば{1, 5, 99}

ハッキーな方法は、可能な値の範囲をループして、どの値にヘッド「データ」がないかを確認することです(たとえばSelect[data/@Range[1,1000],(Not[MatchQ[#,_data]])?])が、これは一般的ではないため魅力的ではありません(たとえばdata[dog] = "Max";、整数添え字要件)、上限を選択できることを前提としています。また、速度が遅くなり、メモリが無駄になります。

4

2 に答える 2

4

私はまだMathematicaマシンを使用していませDownValues[data]んが、sを取得するために操作して喜んでもらえる可能性のあるルールのリストを返す可能性がありますi。おそらくこのようなものです。

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 に答える