2014-04-01 29 views
2

我有一個嵌套列表,其中每個子列表的結構如下:[[xcor ycor] weight]。 每個刻度我想更新這些子列表樣本中的權重。更改嵌套列表中的過濾值

我生產,樣品(例如大小2)使用本賽第一輪的擴展(非常helpful answers/comments)嵌套列表total

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

重複鍵(鍵是'[xcor ycor]'對)的情況下會發生什麼? –

+0

@BryanHead如果該關鍵字包含在'updatedSample'中,所有重複鍵的權重應該在'total'中改變。對不起,不清楚。 – Dave

回答

2

這是一個很大的問題。您使用的數據結構稱爲association list或簡稱alist,其中密鑰爲[xcor ycor],值爲權重。鑑於你的任務,最好使用鍵來查找事物而不是索引。因此,replace-item在這裏並沒有真正的幫助。相反,我們可以在total上運行map,使用來自updatedSample的值(如果它們在那裏),並且默認爲total中的值。首先,我們需要一個方便的功能來查看在alist中的東西。在lisp(影響NetLogo的語言)中,這被稱爲assoc。那就是:如果alist不包含關鍵

to-report assoc [ key alist ] 
    foreach alist [ if key = (first ?) [ report ? ] ] 
    report false 
end 

注意false返回。我們想使用這個函數返回的條目,如果它不是假的,否則使用別的東西。因此,我們需要另一個輔助函數:

to-report value-or-else [ value default ] 
    report ifelse-value (value = false) [ default ] [ value ] 
end 

最後,我們可以寫,做的映射函數:

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

+0

這是完美的,非常有教育意義。非常感謝你!我想我並沒有完全明白我實際上在做什麼。 – Dave