NetLogo - 将单个值添加到列表列表

NetLogo - Add a single value to a list of lists

我正在尝试在必要时将值输入到列表列表中。

我全局定义一个列表:

set mylist [[[][]][[][]]]

在模拟的各个阶段,我希望代理向列表中插入一个值(这些值将构成它们自己的列表)。例如,如果我想将值 2 添加到项目 1 的项目 0,我会输入:

....
set item 0 item 1 mylist lput 2 item 0 item 1 mylist
....

return错误消息"This isn't something you can use "设置为“打开。”有什么帮助吗?我似乎对添加到列表有一个根本性的误解。

仅供参考,对于上面的示例,我的 return 将 mylist 变为:

[[[][]][[2][]]]

(如果需要,不同的代理将有机会在稍后的模拟中将另一个值添加到项目 1 的项目 0)。

谢谢

NetLogo 列表是不可变的,这意味着您实际上永远无法更改现有列表,只能创建一个新列表。如果你想修改 mylist,你需要 set mylist ... 其中 ... 是你刚刚构建的新列表。

根据旧列表创建一个新列表,除了在一个地方交换不同的值,嗯,这就是 replace-item 所做的。

但是 replace-item 不知道嵌套,所以我们必须自己处理,通过调用 replace-item 两次,一次用于内部列表,一次用于外部列表。

我假设你的列表有一个固定的嵌套深度 2,你不需要处理任意的嵌套深度。

我们需要的第一个积木,我们可以从逐字复制:

to-report replace-subitem [index1 index2 lists value]
  let old-sublist item index1 lists
  report replace-item index1 lists (replace-item index2 old-sublist value)
end

现在为了解决您的问题,我们只需要做一些额外的工作:

to-report lput-subitem [index1 index2 lists value]
  report replace-subitem index1 index2 lists
           lput value (item index2 item index1 lists)
end

让我们试一试:

observer> set mylist [[[][]][[][]]]
observer> print mylist
[[[] []] [[] []]]
observer> set mylist lput-subitem 1 0 mylist 2
observer> set mylist lput-subitem 1 0 mylist 3
observer> print mylist
[[[] []] [[2 3] []]]

有效!