Netlogo 添加到列表列表
Netlogo adding to list of lists
我希望将补丁变量值添加到空列表列表中。补丁分为不同的区域,我正在尝试查看某些补丁变量如何因区域而异。
我有一个空列表列表(实际上包含 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 语句上,但我不知道它是什么。有帮助吗?
你的基本方法是好的,除了你必须分配一个名字。例如,
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
但是,您可能希望为此使用 table 扩展。
我可以理解 foreach mylist [ set ?1 ... ]
背后的想法,但 NetLogo 不是那样工作的。 set ?1 ...
对原始列表没有影响。 NetLogo 列表是不可变的,并且 ?1
不是对列表中可更新位置的引用——它只是一个临时变量,值已复制到其中。所以set ?1 ...
是你基本不会写的
如果我没有正确理解你的问题,这里的相关原语是map
。这应该可以完成工作:
set mylist (map [lput (sum-zone-variable ?2) ?1] mylist zonelist)
我希望将补丁变量值添加到空列表列表中。补丁分为不同的区域,我正在尝试查看某些补丁变量如何因区域而异。 我有一个空列表列表(实际上包含 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 语句上,但我不知道它是什么。有帮助吗?
你的基本方法是好的,除了你必须分配一个名字。例如,
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
但是,您可能希望为此使用 table 扩展。
我可以理解 foreach mylist [ set ?1 ... ]
背后的想法,但 NetLogo 不是那样工作的。 set ?1 ...
对原始列表没有影响。 NetLogo 列表是不可变的,并且 ?1
不是对列表中可更新位置的引用——它只是一个临时变量,值已复制到其中。所以set ?1 ...
是你基本不会写的
如果我没有正确理解你的问题,这里的相关原语是map
。这应该可以完成工作:
set mylist (map [lput (sum-zone-variable ?2) ?1] mylist zonelist)