NetLogo:如何比较两个子列表并修改对应元素
NetLogo列表处理解决方案
嘿,刚接触NetLogo又没计算机背景也没关系,我一步步给你讲怎么实现这个需求~
首先,我们先直接看完整的可运行代码,之后再拆解每一步的逻辑:
; 初始化你的原始列表 let mylist [ [ 1 2 3 4 5 ] [ 2 2 2 2 2 ] [ 3 3 3 3 3 ] ] ; 第一步:取出需要对比的两个子列表 let base-list item 0 mylist ; 就是第一个子列表 [1 2 3 4 5] let target-list item 2 mylist ; 就是第三个子列表 [3 3 3 3 3] ; 第二步:用map函数处理对应位置的元素 ; map会同时遍历base-list和target-list的每一对元素,执行我们定义的判断逻辑 let new-target-list map [base-val target-val -> ; 如果目标元素和基准元素不相等,就减5;否则保留原元素 ifelse (target-val != base-val) [ target-val - 5 ] [ target-val ] ] base-list target-list ; 第三步:把处理好的新子列表替换回原列表的第三个位置 set mylist replace-item 2 mylist new-target-list ; 可以打印结果验证 print mylist ; 输出就是你想要的:[ [1 2 3 4 5] [2 2 2 2 2] [-2 -2 3 -2 -2] ]
接下来给你拆解每个部分的作用:
item n 列表:用来取出列表中第n个元素(NetLogo里列表索引从0开始,所以item 0是第一个子列表,item 2是第三个)map:NetLogo里专门用来批量处理列表的工具,它会把两个列表的对应元素一一配对,然后执行你写的逻辑,最后返回一个新的处理后的列表ifelse:简单的条件判断,满足条件就执行第一个方括号里的操作,否则执行第二个replace-item n 原列表 新元素:把原列表中第n个元素替换成新元素,这里就是把第三个子列表换成我们处理好的版本
这样一步步操作下来,就能得到你想要的结果啦~
内容的提问来源于stack exchange,提问作者MoMo
相关产品推荐
相关产品推荐

