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

3
我是一位有用的助手,可以翻译文本。
我正在尝试在必要时将一个值输入到列表中的列表中。 我全局定义了一个列表:
set mylist [[[][]][[][]]]

在模拟的不同阶段,我希望代理能够向列表中插入值(这些值将组成它们自己的列表)。例如,如果我想要将值2添加到项目1的项目0中,我会写:
....
set item 0 item 1 mylist lput 2 item 0 item 1 mylist
....

这会返回错误消息"This isn't something you can use "set" on."。有什么帮助吗?我似乎对于向列表添加元素有一个基本的误解。

顺便说一下,对于上述示例,我的预期结果是使mylist变成:

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

(如果需要的话,不同的代理可以在模拟后期为项目1中的项目0添加另一个值。)
谢谢

你需要使用 replace-item。请注意,replace-item 返回一个新的列表;NetLogo 列表是不可变的,因此你需要使用 set mylist replace-item ... - Seth Tisue
可能有帮助:http://stackoverflow.com/q/23182872/86485,https://dev59.com/v3vaa4cB1Zd3GeqPHL0b - Seth Tisue
谢谢您的回复。这涵盖了在列表中替换项目,但是是否可以使用lput将项目添加到列表中而不是完全替换它?这就是我仍然卡住的地方。 - Stephen
你考虑过表扩展吗?通过键访问列表可能比通过位置更直观。 - Alan
1个回答

3
NetLogo的列表是不可变的,这意味着您实际上永远无法更改现有列表,只能创建一个新列表。如果您想修改mylist,则需要使用set mylist ...,其中...是您刚刚构建的新列表。
要基于旧列表创建一个除了在某个地方换入不同值的新列表,那就是replace-item的作用。
但是,replace-item不知道嵌套,因此我们必须通过两次调用replace-item来处理它自己的嵌套问题,一次用于内部列表,一次用于外部列表。
我假设您的列表具有固定的嵌套深度为2,并且您不需要处理任意嵌套深度。
我们需要的第一个构建块可以从https://stackoverflow.com/a/23256444/86485中直接复制。
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] []]]

它起作用了!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接