Ich möchte eine Struktur wie HashTable verwenden. Gibt es eine ähnliche Struktur in Wolfram Mathematica?Gibt es HashTable-Struktur in Wolfram Mathematica?
Antwort
Aktualisierung: Mathematica Version 10 eingeführt die Association
Datenstruktur (tutorial).
Es gibt eine Reihe von Möglichkeiten. Die einfachste Möglichkeit, die gut funktioniert, wenn Sie keine Schlüssel aus Ihrer Tabelle hinzufügen oder löschen müssen, oder die zugehörigen Werte ändern, besteht darin, eine Liste von Regeln mit dem Schlüssel auf der linken Seite und dem Wert auf der rechten Seite zu erstellen -hand Seite, und verwenden Sie Dispatch
darauf. Wenn Sie die Einträge in Ihrer Tabelle ändern müssen, können Sie das DownValues
eines Symbols als Hash-Tabelle verwenden. Dies unterstützt alle Operationen, die üblicherweise mit Hash-Tabellen verwendet werden. Hier ist der direkteste Weg, dies zu tun:
(* 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
Ich würde sagen, die ähnlichste Struktur, die Sie erhalten können aus der Box sind sparse arrays.
ich mit Pillsy zustimmen, aber auch diese Antwort:
Es enthält eine praktische Funktion für den Schlüssel einer Hash-Tabelle zu bekommen.
I Dictionary.m Modul gemacht haben, die enthalten:
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]]
];
];
]
vergessen: FürJeden = Funktion [ { Liste, func }, len = Länge [Liste]; Für [i = 1, i <= len, i ++, func [Liste [[i]]]; ]; ] – Fiard
können Sie Ihre Antwort so bearbeiten, dass sie diese enthält. –
Mathematica 10 führt Association, <| k -> v |>
,
<|a -> x, b -> y, c -> z|>
%[b]
y
die im Grunde ein Wrapper für eine Liste von Regeln ist: Convert eine Liste von Regeln für eine Zuordnung:
Association[{a -> x, b -> y, c -> z}]
<|a -> x, b -> y, c -> z|>
Konvertieren einer Assoziation in eine Liste von Regeln:
Normal[<|a -> x, b -> y, c -> z|>]
{a -> x, b -> y, c -> z}
Diese Antwort verdient mehrere Stimmen mehr. Meiner bescheidenen Meinung nach ist es fast immer besser, Out-of-the-Box-Strukturen zu verwenden als eigene zu konstruieren. Aber 'Pillsy' hat auch eine sehr gute Antwort gegeben. – Shredderroy