>我无法将列表的第一个项目值分配给变量。例如?我有 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]
?只是猜测,但在这里我们跑题了