data structures - ¿Hay estructura HashTable en Wolfram Mathematica?
data-structures wolfram-mathematica (5)
Quiero usar una estructura como HashTable. ¿Hay una estructura similar en Wolfram Mathematica ?
Estoy de acuerdo con Pillsy, pero también veo esta respuesta:
Incluye una función práctica para obtener las claves de una tabla hash.
He hecho el módulo Dictionary.m, que contenía:
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]]
];
];
]
Mathematica 10 introduce la asociación, <| k -> v |>
<| k -> v |>
,
<|a -> x, b -> y, c -> z|>
%[b]
y
Que es básicamente un contenedor para una lista de reglas: convierta una lista de reglas a una asociación:
Association[{a -> x, b -> y, c -> z}]
<|a -> x, b -> y, c -> z|>
Convertir una asociación a una lista de reglas:
Normal[<|a -> x, b -> y, c -> z|>]
{a -> x, b -> y, c -> z}
Yo diría que la estructura más similar que puedes sacar de la caja son matrices dispersas .
Actualización: Mathematica versión 10 introdujo la estructura de datos de la Association
( tutorial ).
Hay un numero de posibilidades. La posibilidad más sencilla, que funciona bien si no necesita agregar o eliminar claves de su tabla, o cambiar sus valores asociados, es construir una lista de reglas con la clave en el lado izquierdo y el valor en el derecho - lado de la mano, y usar Dispatch
en él.
Si necesita cambiar las entradas en su tabla, puede usar los DownValues
de DownValues
de un símbolo como una tabla hash. Esto apoyará todas las operaciones que uno usa comúnmente con tablas hash. Aquí está la manera más directa de hacer eso:
(* 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