我是Netlogo的新手还在学习,我想要做的是在更新完成后调用一个列表并对其进行另一次更新,直到达到条件,如果有一个列表
let xy [[-2 6][-1 6][0 6][-1 6][-2 6][1 5][2 5][-3 9][-4 9][-5 9][-6 9][-3 9]]
let same true
我试图从列表中删除两个相同元素之间的第一个子列表[-2 6] [ - 1 6] [0 6] [ - 1 6] [ - 2 6]然后我还想删除子列表在另外两个相同的元素[-3 9] [ - 4 9] [ - 5 9] [ - 6 9] [ - 3 9]之间,直到没有更多元素重复,在这种情况下结果应该是[[1 5] [2 5]]并在删除具有以下条件的子列表后控制此列表:
if length xy = length remove-duplicates xy [ set same false ]
我已经完成了下面的删除代码,它删除了第一个子列表但我可能有很多子列表,我想知道如何在一次删除后再次获得更新列表(在这种情况下我应该以某种方式采取代码中的最终列表)并使用这些条件再次控制它。 我正在考虑做一个to-report程序和一个while循环,例如(也许我错了)
to-report update-list [list]
while [same != false ]
[ ; do the removal stuff
set list-xy item POSITION (FIRST MODES xy) xy xy
let first-pos POSITION (FIRST MODES xy) xy
set list-temp remove-item first-pos xy
set sec-pos position list-xy list-temp + 1
set sublist-1 sublist xy 0 first-pos
set sublist-2 sublist xy sec-pos length xy
set final-list sentence sublist-1 sublist-2
set xy final-list
; the condition if i don't have any duplicates the size of two lists should have the same size , no duplicates
if length xy = length remove-duplicates xy
[ set same false ]
]
report update-list xy
我不确定在程序结束时报告什么以及如何再次回忆该列表,所以我可以删除所有这些子列表。
任何想法都表示赞赏,谢谢
答案 0 :(得分:1)
使用递归最容易解决:
to-report remove-fenced-sublists [xs]
if empty? xs
[ report [] ]
let pos position first xs butfirst xs
if not is-number? pos
[ report fput first xs remove-fenced-sublists butfirst xs ]
report remove-fenced-sublists sublist xs (pos + 2) length xs
end
示例运行:
observer> show remove-fenced-sublists [[-2 6][-1 6][0 6][-1 6][-2 6][1 5][2 5][-3 9][-4 9][-5 9][-6 9][-3 9]]
observer: [[1 5] [2 5]]
答案 1 :(得分:1)
如果我了解您的目标,则可以通过逐项构建新列表来捕获您的核心需求,但只要出现重复项就会对其进行修剪。对于单个新项目,这是:
to-report trim-or-grow [#list #item]
let _i position #item #list
report ifelse-value (_i != false) [sublist #list 0 _i] [lput #item #list]
end
然后您可以通过此记者减少:
to test
let xy [[-2 6][-1 6][0 6][-1 6][-2 6][1 5][2 5][-3 9][-4 9][-5 9][-6 9][-3 9]]
print reduce trim-or-grow fput [] xy
end