2009-09-08 25 views

Trả lời

22

Cập nhật: Mathematica phiên bản 10 đã giới thiệu cấu trúc dữ liệu Association (tutorial).


Có một số khả năng. Khả năng dễ nhất, hoạt động tốt nếu bạn không cần phải thêm hoặc xóa các khóa khỏi bảng hoặc thay đổi giá trị được kết hợp của chúng, là xây dựng danh sách các quy tắc có khóa ở phía bên trái và giá trị ở bên phải bên cạnh và sử dụng Dispatch trên đó.

Nếu bạn cần thay đổi các mục nhập trong bảng của mình, bạn có thể sử dụng DownValues của biểu tượng dưới dạng bảng băm. Điều này sẽ hỗ trợ tất cả các hoạt động thường sử dụng với các bảng băm. Đây là cách đơn giản nhất để làm điều đó:

(* 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

Tôi muốn nói cấu trúc tương tự nhất mà bạn có thể nhận được ngoài hộpsparse arrays.

+0

Câu trả lời này xứng đáng nhận được nhiều phiếu bầu hơn nữa. Theo quan điểm khiêm nhường của tôi, hầu như luôn sử dụng các cấu trúc vượt trội hơn là xây dựng của riêng mình. Nhưng 'Pillsy' cũng đã đưa ra một câu trả lời rất hay. – Shredderroy

5

Tôi đồng ý với Pillsy, nhưng xem thêm câu trả lời này:

Mathematica Downvalue Lhs

Nó bao gồm một chức năng tiện dụng để nhận được chìa khóa của một bảng băm.

3

Tôi đã thực hiện mô-đun Dictionary.m, trong đó có:

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

quên: ForEach = Function [ { danh sách, func }, len = Chiều dài [list]; Đối với [i = 1, i <= len, i ++, func [danh sách [[i]]]; ]; ] – Fiard

+1

bạn có thể chỉnh sửa câu trả lời của mình để bao gồm câu trả lời đó. –

3

Mathematica 10 giới thiệu Hiệp hội, <| k -> v |>,

<|a -> x, b -> y, c -> z|> 
%[b] 
y 

cơ bản Đó là một wrapper cho một danh sách các quy tắc: Chuyển đổi danh sách các quy tắc cho một liên kết:

Association[{a -> x, b -> y, c -> z}] 
<|a -> x, b -> y, c -> z|> 

Chuyển đổi liên kết thành danh sách các quy tắc:

Normal[<|a -> x, b -> y, c -> z|>] 
{a -> x, b -> y, c -> z} 
Các vấn đề liên quan