Netlogo添加到列表列表

时间:2015-11-25 05:03:19

标签: list iteration netlogo

我希望将补丁变量值添加到空列表列表中。这些补丁分为不同的区域,我试图看看某些补丁变量是如何因区域而异的。 我有一个空的列表列表(实际上包含12个列表,但为了简单起见):

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

与不同区域对应的列表:

set zone-list [1 2 3 4]

以下是我正在尝试构建列表的方法:

(foreach mylist zone-list [set ?1 lput (sum-zone-variable ?2) ?1])

to-report sum-zone-variable [ n ]
  report (sum [patch-variable] of patches with [zone = n])
end

当我运行它时,mylist保持为空(即未更改)。我认为问题在于foreach声明,但我无法弄清楚它是什么。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

我可以看到foreach mylist [ set ?1 ... ]背后的想法,但NetLogo不会那样工作。 set ?1 ...对原始列表没有影响。 NetLogo列表是不可变的,?1不是对列表中可更新位置的引用 - 它只是一个已复制值的临时变量。所以set ?1 ...是你基本上不会写的东西。

如果我正确理解你的问题,那么这里的相关原语是map。这应该做的工作:

set mylist (map [lput (sum-zone-variable ?2) ?1] mylist zonelist)

答案 1 :(得分:1)

除了必须指定名称外,您的基本方法还可以。如,

globals [mylist zone-list n-zones]

patches-own [zone zone-variable]

to setup
  set n-zones 4
  set zone-list n-values n-zones [?]
  ask patches [set zone one-of zone-list]
  set mylist n-values n-zones [[]]
end

to go
  ask patches [set zone-variable random-float 1]
  foreach zone-list [
    let total sum [zone-variable] of patches with [zone = ?]
    let oldvals item ? mylist
    set mylist replace-item ? mylist (lput total oldvals)
  ]
end

但是,您可能希望使用表扩展名。