更改嵌套列表中的筛选值

时间:2014-04-01 15:53:45

标签: nested-lists netlogo

我有一个嵌套列表,其中每个子列表的结构如下:[[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传递相应的值。

1 个答案:

答案 0 :(得分:2)

这是一个很大的问题。您正在使用的数据结构称为association list,或简称alist,其中键为[xcor ycor],值为权重。鉴于您的任务,最好使用键来查找内容而不是索引。因此,replace-item在这里并没有真正帮助。相反,我们可以maptotal上运行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}}。