17

HashTableのような構造を使用したい。Wolfram Mathematicaにも同様の構造がありますか?

4

5 に答える 5

22

更新: Mathematica バージョン 10 でAssociationデータ構造が導入されました (チュートリアル)。


いくつかの可能性があります。テーブルにキーを追加または削除したり、関連する値を変更したりする必要がない場合にうまく機能する最も簡単な方法は、左側にキー、右側に値を指定してルールのリストを作成することです。 -手側、および使用Dispatch

テーブルのエントリを変更する必要がある場合DownValuesは、シンボルの をハッシュ テーブルとして使用できます。これにより、ハッシュ テーブルで一般的に使用されるすべての操作がサポートされます。これを行う最も簡単な方法は次のとおりです。

(* Set some values in your table.*) 
In[1]:=  table[a] = foo; table[b] = bar; table[c] = baz;

(* Test whether some keys are present. *)
In[2]:=  {ValueQ[table[a]], ValueQ[table[d]]}
Out[2]:= {True, False}

(* Get a list of all keys and values, as delayed rules. *)
In[3]:=  DownValues[table]
Out[3]:= {HoldPattern[table[a]] :> foo, HoldPattern[table[b]] :> bar,
HoldPattern[table[c]] :> baz}

(* Remove a key from your table. *)
In[4]:=  Unset[table[b]]; ValueQ[table[b]]
Out[4]:= False
于 2009-09-08T14:24:22.087 に答える
8

箱から出してすぐに使える最も類似した構造は、スパース配列だと思います。

于 2009-09-08T04:49:25.650 に答える
5

Pillsy に同意しますが、この回答も参照してください。

Mathematica Downvalue Lhs

ハッシュ テーブルのキーを取得するための便利な関数が含まれています。

于 2009-09-09T02:04:04.717 に答える
4

以下を含む Dictionary.m モジュールを作成しました。

DictHasKey = Function[
    {
        dict,
        key
    },
    ValueQ[dict[key]]
]

DictAddKey = Function[
    {
        dict,
        key,
        value
    },
    If[
        DictHasKey[dict,key],
        Print["Warning, Dictionary already has key " <> ToString[key]]
    ];
    dict[key] = value;
]

DictKeys = Function[
    {
        dict
    },
    res = {};
    ForEach[DownValues[dict], Function[{dictKeyDescr},
        res = Append[res, ((dictKeyDescr[[1]]) /. dict -> neverUsedSymbolWhatever)[[1, 1]]];
    ]];
    res
]

DictValues = Function[
    {
        dict
    },
    res = {};
    ForEach[DownValues[dict], Function[{dictKeyDescr},
        res = Append[res, dictKeyDescr[[2]]];
    ]];
    res
]

DictKeyValuePairs = Function[
    {
        dict
    },
    res = {};
    ForEach[DownValues[dict], Function[{dictKeyDescr},
        res = Append[res, {((dictKeyDescr[[1]]) /. dict -> neverUsedSymbolWhatever)[[1, 1]], dictKeyDescr[[2]]}];
    ]];
    res
]

ForEach = Function[
    {
        list, 
        func 
    }, 
    len = Length[list]; 
    For[i = 1, i <= len, i++, 
        func[
            list[[i]]
        ]; 
    ]; 
]
于 2011-11-30T16:34:48.587 に答える