如何访问 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
我无法将列表的第一项值分配给 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