Я хочу использовать структуру, такую как HashTable. Есть ли аналогичная структура в Wolfram Mathematica?
Есть ли структура HashTable в Wolfram Mathematica?
Ответ 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}