我有一个嵌套列表,其中每个子列表的结构如下:[[xcor ycor] weight]
。
每个刻度我想在这些子列表的样本中更新权重。
我使用Rnd扩展(非常helpful answers/comments)从嵌套列表total
生成样本(例如大小为2):
set total [ [[0 1] 1] [[2 3] 2] [[4 5] 3] [[6 7] 4] [[0 1] 1] ]
set sample rnd:weighted-n-of 2 total [ last ? ]
然后我更新样本中的权重(假设将它们乘以2)并将它们映射到各自的[xcor ycor] -pair。
let newWeights (map [last ? * 2] sample)
let updatedSample (map list (map [first ?] sample) newWeights)
如何在total
中替换这些条目,同时记住它可能会包含重复的条目?
这似乎是replace-item
的完美工作,但我不知道如何构建适当的索引,然后从updatedSample
传递相应的值。
答案 0 :(得分:2)
这是一个很大的问题。您正在使用的数据结构称为association list,或简称alist,其中键为[xcor ycor]
,值为权重。鉴于您的任务,最好使用键来查找内容而不是索引。因此,replace-item
在这里并没有真正帮助。相反,我们可以map
在total
上运行updatedSample
,使用total
中的值(如果它们在那里),并默认为assoc
中的值。首先,我们需要一个便利功能来查看alist中的内容。在lisp(一种影响NetLogo的语言)中,这称为to-report assoc [ key alist ]
foreach alist [ if key = (first ?) [ report ? ] ]
report false
end
。这是:
false
请注意,如果alist
不包含密钥,则会返回to-report value-or-else [ value default ]
report ifelse-value (value = false) [ default ] [ value ]
end
。我们想要使用此函数返回的条目,如果它不是false,否则使用其他东西。因此,我们需要另一个辅助函数:
to-report update-alist [ alist updated-entries ]
report map [ value-or-else (assoc first ? updated-entries) ? ] alist
end
最后,我们可以编写一个执行映射的函数:
observer> show update-alist [[[0 1] 1] [[2 3] 2] [[4 5] 3] [[6 7] 4] [[0 1] 1]] [[[0 1] 10] [[4 5] 45]]
observer: [[[0 1] 10] [[2 3] 2] [[4 5] 45] [[6 7] 4] [[0 1] 10]]
这是实际行动:
update-alist total updatedSample
您希望将其称为{{1}}。