Netlogo中如何查找列表中首个属性值不同的元素位置
解决NetLogo中查找路径首个mode变化节点位置的问题
问题回顾
你需要在海龟的myway节点列表中,找到第一个mode属性与前一个节点不同的元素位置。比如myway对应的mode列表为["bike" "bike" "bike" "bike" "train" "train"]时,目标位置是4(NetLogo列表索引从0开始)。
错误原因分析
你之前尝试的position (first mymodes != "Bici") mymodes逻辑有误:
first mymodes != "Bici"会生成一个布尔值(true或false)position命令是在列表中查找指定值的位置,但你的mymodes是字符串列表,不存在布尔值,因此返回false,无法得到正确位置。
正确实现方法
步骤1:生成mode列表(优化版)
用map替代foreach可以更简洁地生成与myway顺序一致的mode列表:
ask turtle 4455 [ let mymodes map [r -> [mode] of r] myway show mymodes ; 输出:["bike" "bike" "bike" "bike" "train" "train"] ]
步骤2:查找首个mode变化的位置
通过循环从第二个元素(索引1)开始,逐个比较当前元素与前一个元素的mode,找到第一个不同的索引:
ask turtle 4455 [ let mymodes map [r -> [mode] of r] myway let first-diff-pos -1 ; 初始值表示未找到变化 let i 1 ; 遍历列表直到找到变化或遍历结束 while [i < length mymodes and first-diff-pos = -1] [ if item i mymodes != item (i - 1) mymodes [ set first-diff-pos i ] set i i + 1 ] show first-diff-pos ; 例子中会输出4 ]
补充说明
- 如果
myway中所有节点的mode都相同,first-diff-pos会保持为-1,你可以根据需求添加对应的处理逻辑。 - NetLogo列表索引从0开始,因此例子中第五个元素(从1计数)的索引是4,与你的需求匹配。
内容的提问来源于stack exchange,提问作者Aitor
相关产品推荐
相关产品推荐

