2009-09-08 9 views

Antwort

22

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 
6

Ich würde sagen, die ähnlichste Struktur, die Sie erhalten können aus der Box sind sparse arrays.

+0

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

5

ich mit Pillsy zustimmen, aber auch diese Antwort:

Mathematica Downvalue Lhs

Es enthält eine praktische Funktion für den Schlüssel einer Hash-Tabelle zu bekommen.

3

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]] 
     ]; 
    ]; 
] 
+0

vergessen: FürJeden = Funktion [ { Liste, func }, len = Länge [Liste]; Für [i = 1, i <= len, i ++, func [Liste [[i]]]; ]; ] – Fiard

+1

können Sie Ihre Antwort so bearbeiten, dass sie diese enthält. –

3

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}