在 Mathematica 中通过引用传递列表元素

问题描述

我正在使用这个我称之为“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] ]] 给出了对关联的引用。