【问题标题】:NetLogo - Add a single value to a list of listsNetLogo - 将单个值添加到列表列表
【发布时间】:2016-03-09 23:21:26
【问题描述】:

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

我在全局范围内定义一个列表:

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

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

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

这会返回错误消息“这不是您可以使用“设置”的东西。”有什么帮助吗?我似乎对添加到列表有一个根本的误解。

仅供参考,我对上述示例的预期回报将是 mylist 变为:

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

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

谢谢

【问题讨论】:

  • 你需要replace-item。注意replace-item 返回一个新列表; NetLogo 列表是不可变的,所以你需要set mylist replace-item ...
  • 感谢您的回复。这包括替换列表中的项目,但是是否可以将项目添加到列表中(使用 lput)而不是完全替换它?这是我仍然卡住的地方。
  • 你考虑过表扩展吗?通过按键而不是按位置访问您的列表可能更直观。

标签: list add netlogo items


【解决方案1】:

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] []]]

有效!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 2021-12-13
    • 1970-01-01
    • 2013-06-11
    相关资源
    最近更新 更多