NetLogo中如何去除两个列表中连续重复的坐标项并导出CSV
NetLogo 连续重复坐标记录去重实现方案
该需求完全可以实现,推荐优先在坐标记录阶段过滤连续重复值,运行效率更高,也可以选择导出前批量处理,两种方案如下:
方案1:记录时实时过滤(推荐)
仅修改register-coordinates过程,新增坐标前先判断是否和上一次记录的坐标一致,不一致才写入列表:
to register-coordinates ; 仅当当前坐标与最近一次记录的坐标不重复时,才新增记录 if (pxcor != last pxcor-list) or (pycor != last pycor-list) [ set pxcor-list lput pxcor pxcor-list set pycor-list lput pycor pycor-list set mytimer lput ticks mytimer ] end
该方案完全符合你的示例场景:初始记录(0 0),后续停留在(0 0)时不会重复写入,移动到(0 1)、回到(0 0)时正常写入,最终输出的列表就是你期望的去重结果。
方案2:导出前批量处理
如果不需要修改记录逻辑,可以在输出前对已有的坐标列表做连续去重处理,修改output过程即可:
To output ; 先对坐标和时间列表做连续去重 let filtered-px (list item 0 pxcor-list) let filtered-py (list item 0 pycor-list) let filtered-time (list item 0 mytimer) let list-length length pxcor-list for [i 1 (list-length - 1)] [ let last-saved-px last filtered-px let last-saved-py last filtered-py let curr-px item i pxcor-list let curr-py item i pycor-list if (curr-px != last-saved-px) or (curr-py != last-saved-py) [ set filtered-px lput curr-px filtered-px set filtered-py lput curr-py filtered-py set filtered-time lput item i mytimer filtered-time ] ] ; 用处理后的列表生成输出 let cur-who-list n-values (length filtered-px) [ who ] (foreach cur-who-list filtered-px filtered-py filtered-time [ [a b c d] -> let to-append (list a b c d) set Outputlist lput to-append Outputlist ] ) ; 注意原代码中outifle为拼写错误,修正为outfile csv:to-file (word outfile ".csv") Outputlist end
额外注意事项
- 原代码中全局变量
outifle为拼写错误,建议修正为outfile避免导出报错 - 如果需要统计turtle在同一个patch的停留时长,可以在
register-coordinates中新增停留时长字段,无需额外修改去重逻辑
内容的提问来源于stack exchange,提问作者Rafaela
相关产品推荐
相关产品推荐

