2009-09-08 2 views

ответ

22

Обновление: В Mathematica версии 10 представлена ​​структура данных Association (tutorial).


Существует ряд возможностей. Простейшая возможность, которая работает хорошо, если вам не нужно добавлять или удалять ключи из вашей таблицы или изменять их связанные значения, заключается в построении списка правил с ключом в левой части и значением справа -hand side, и используйте на нем 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 
6

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

+0

Этот ответ заслуживает еще нескольких голосов. По моему скромному мнению, почти всегда лучше использовать готовые структуры, чем строить свои собственные. Но «Пиллси» также дал очень хороший ответ. – Shredderroy

5

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

Mathematica Downvalue Lhs

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

3

Я сделал модуль 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]] 
     ]; 
    ]; 
] 
+0

забыл: ForEach = Function [ { список, Func }, LEN = длина [список]; Для [i = 1, i <= len, i ++, func [list [[i]]]; ]; ] – Fiard

+1

вы можете отредактировать свой ответ, чтобы включить это. –

3

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} 
Смежные вопросы