问题描述
我正在使用这个我称之为“associationList”的数据结构,它具有以下格式:
<| key1->{value1,value2,...},key2->{value1,...|>
我想让函数 Add[assocList_,key_,value_]
通过引用将 key->{value}
添加到 associationList。我有以下代码:
Add[assoc_,elt_] :=
If[Head@assoc[key] === Missing,AppendTo[assoc,key -> {elt}],AppendTo[assoc[key],elt]];
SetAttributes[AddToAssocList,HoldFirst];
Add 函数适用于此示例:
y=<||>;
Add[y,1,a];
(* y is <|1->{a}|> *)
Add[y,b];
(* y is <|1->{a,b}|> *)
y={<||>};
Add[y[[1]],a];
(* y is <|1->{a}|> *)
Add[y[[1]],b];
(* Error - Association - "<|1->{a}|> in the part assignment is not a symbol" *)
使用任何类型的保持似乎都无济于事。有什么想法吗?
解决方法
答案是将 Add 中的 assoc[key]
更改为 assoc[[ Key[key] ]]
。这是有效的,因为 assoc[key]
给出了一个关联,而 assoc[[ Key[key] ]]
给出了对关联的引用。