这可能是一个初学者的问题,但在使用NetLogo Progamming指南后,我无法找到解决方案...
我正在尝试迭代一对列表,并根据测试条件有条件地更新这些值。
Netlogo论坛中的This thread给了我一个使用LIST原语记者的提示,但我仍然无法获得预期的输出。
这是一个描述我的问题的简化示例。 请注意,listA和listB都填充了变量。
to test
let a1 1
let a2 5
let listA (list a1 a2)
let b1 6
let b2 3
let listB (list b1 b2)
(foreach (list listA) (list listb) [
[a b] -> ifelse a < b [set a "a"][set b "b"]])
show lista
show listb
end
;expected Output
;observer: [a 5]
;observer: [6 b]
有人能给我一个暗示吗?我究竟做错了什么?
答案 0 :(得分:2)
NetLogo中的列表是不可变的 - 您不能像这种方法那样更改值。 map
可能更适合这个:
to test2
let a1 1
let a2 5
let listA (list a1 a2)
let b1 6
let b2 3
let listB (list b1 b2)
show ( map [ [ a b ] ->
ifelse-value ( a < b ) [ "a" ] [ a ] ]
listA listB ;; pass the lists [ 1 5 ] and [ 6 3 ]
)
show ( map [ [ a b ] ->
ifelse-value ( a > b ) [ "b" ] [ b ] ]
listA listB ;; pass the lists [ 1 5 ] and [ 6 3 ]
)
end
请注意,我认为lista
的预期输出应为["a" 5]
而不是["a" 0]
- 这是正确的吗?
如果您想使用foreach
来修改原始列表,我会创建一个索引(列表长度为0)以传递给replace-item
:
to test3
let a1 1
let a2 5
let listA (list a1 a2)
let b1 6
let b2 3
let listB (list b1 b2)
let indexer ( range 0 length listA )
foreach indexer [ ind ->
let current_a item ind listA
let current_b item ind listB
ifelse current_a < current_b [
set listA replace-item ind listA "a"
] [
set listB replace-item ind listB "b"
]
]
print listA
print listB
end