Подтвердить что ты не робот

Есть ли структура HashTable в Wolfram Mathematica?

Я хочу использовать структуру, такую ​​как HashTable. Есть ли аналогичная структура в Wolfram Mathematica?

4b9b3361

Ответ 1

Обновление: В версии 10 Mathematica появилась структура данных 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

Ответ 2

Я бы сказал, что наиболее похожая структура, которую вы можете получить из коробки, разреженные массивы.

Ответ 3

Я согласен с Пиллси, но см. также этот ответ:

Линейные значения Mathematica Lhs

Он включает удобную функцию для получения ключей хэш-таблицы.

Ответ 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]]
        ]; 
    ]; 
]

Ответ 5

Mathematica 10 представляет Ассоциацию, <| k -> v |>,

<|a -> x, b -> y, c -> z|>
%[b]
y

В основном это оболочка для списка правил: Преобразование списка правил в ассоциацию:

Association[{a -> x, b -> y, c -> z}]
<|a -> x, b -> y, c -> z|>

Преобразование ассоциации в список правил:

Normal[<|a -> x, b -> y, c -> z|>]
{a -> x, b -> y, c -> z}