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

How to access individual values ​of a list item in NetLogo 6.2?

我无法将列表的第一项值分配给 turtle 变量。例如?我的 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 [condition] [commands])。 按照你现在的方式,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] 之类的话?只是猜测,但我们要 off-topic