如何在 NetLogo 6.2 中访问列表项的各个值?

  • 本文关键字:列表 访问 NetLogo netlogo
  • 更新时间 :
  • 英文 :


>我无法将列表的第一个项目值分配给变量。例如?我有 list3 有 1 个项目,即: 列表3: [[5 2]]

我希望将列表 3 项目 0 的第一个值分配给生殖(即 5),将列表 3 项目 0 的第二个值分配给新陈代谢(即 2)。

我该怎么做?

提前致谢

globals [ ValidHabsItem ValidHabs ItemList3 ]
turtles-own [ profiles-habitat metabolism reproduction ]
to setup
let list1 ( list 2  )
let list2 ( list 5 )
let list3 ( reduce sentence ( map [ i -> map [ j -> list j i ] list2 ] list1 ) ) 
print ( word "list3: " list3 )
let n0 count turtles 
let s length list3 * 10

while [ n0 < s ]
[
let c count patches 
if c = 0 [ stop ]
ask one-of patches
[
sprout 1
[
set profiles-habitat item ValidHabsItem ValidHabs
set reproduction item ItemList3 list3 ;; list3: [[5 2]];; value 5
set metabolism item ItemList3 list3   ;; list3: [[5 2]];; value 2   
]     
]
]
set n0 count turtles
end

您可以通过在命令中心播放并查看 NetLogo 如何响应您对列表的调用来轻松了解如何执行此操作。

只需在"代码"选项卡中创建一个全局变量,如globals [my-list],然后按照我在命令中心中的语句进行操作:

observer> set my-list [[1 2 3] [4 5 6] [7 8 9]]
observer> print my-list
[[1 2 3] [4 5 6] [7 8 9]]

所以在这里我们刚刚创建了一个列表,其项目是其他列表。

因此,我们有:

observer> print first my-list
[1 2 3]
observer> print last my-list
[7 8 9]
observer> print item 1 my-list
[4 5 6]

这意味着现在,对于NetLogo来说,整个first my-list语句等于[1 2 3];换句话说,它是一个包含这些数字的列表。因此,您可以将first my-list视为任何其他列表。例如,如果要从该列表中提取第二项,只需执行以下操作:

observer> print item 1 (first my-list)
2

括号是可选的:它们有助于使语句对人类更具可读性,提醒我们整个first my-list是一个列表,我们正在从中提取第二个项目(即索引为 1 的项目)。但是,NetLogo并不真正需要它:

observer> print item 1 first my-list
2

现在你应该能够轻松解决你的问题,因为你的情况比这更容易:你的list3,在你的例子中是[[5 2]],里面只有一个项目。这意味着first list3等于等于last list3等于item 0 list3,它们都是[5 2]

所以你可以这样做:

set reproduction first (first list3)
set metabolism last (first list3)

通常,您可以将此机制应用于所需的嵌套级别。

例如:

observer> set my-list [[[1 2] [3 4]] [[5 6] [7 8]]]
observer> print my-list
[[[1 2] [3 4]] [[5 6] [7 8]]]
observer> print first my-list
[[1 2] [3 4]]
observer> print last (first my-list)
[3 4]
observer> print first (last (first my-list))
3
<小时 />

PS: 请注意,在while循环中,您需要在命令块中包含set n0 count turtles(如while [条件] [命令])。 你现在的方式是,set n0 count turtles在循环的命令块之外,这意味着循环将永远持续下去,因为它永远不会达到n0更新的地步,因此n0 < s将始终评估为真。

另外,请注意,说

let c count patches 
if c = 0 [ stop ]

在NetLogo中毫无意义:每个模型总是至少有一个补丁,所以你永远不会达到没有补丁的地步。 也许你想说类似if (count patches with [not any? turtles-here] = 0) [stop]?只是猜测,但在这里我们跑题了

最新更新