List NetLogo:如何比较两个子列表

List NetLogo:如何比较两个子列表,list,compare,netlogo,sublist,List,Compare,Netlogo,Sublist,我不是计算机科学出身,对NetLogo也不熟悉,所以我非常感谢您的帮助。我的问题如下: 假设我有一个包含三个列表的列表 Let mylist [ [ 1 2 3 4 5 ] [ 2 2 2 2 2 ] [ 3 3 3 3 3 ] ] 我想检查第2项mylist(即[3 3])中的每个项目,并查看它是否不等于第0项mylist(即[1 2 3 4 5])中的相应项目。如果是这种情况,我想从项目2 mylist中的项目中减去一个常量值5 换句话说,我希望将mylist更改为以下内容: [ [ 1

我不是计算机科学出身,对NetLogo也不熟悉,所以我非常感谢您的帮助。我的问题如下:

假设我有一个包含三个列表的列表

Let mylist [ [ 1 2 3 4 5 ] [ 2 2 2 2 2 ] [ 3 3 3 3 3 ] ]
我想检查
第2项mylist
(即[3 3])中的每个项目,并查看它是否不等于
第0项mylist
(即[1 2 3 4 5])中的相应项目。如果是这种情况,我想从
项目2 mylist
中的项目中减去一个常量值5

换句话说,我希望将mylist更改为以下内容:

[ [ 1 2 3 4 5 ] [ 2 2 2 2 2 ] [ -2 -2 3 -2 -2 ] ]

提前感谢,

我通过分离子列表解决了这个问题:

to go
Let mylist [ [ 1 2 3 4 5 ] [ 2 2 2 2 2 ] [ 3 3 3 3 3 ] ]
let auxiliar-list1 item 0 mylist
let auxiliar-list2 item 2 mylist
foreach ( range 0 ( length auxiliar-list1 ) ) [ num-item ->
    if item num-item auxiliar-list1 != item num-item auxiliar-list2 [
      set auxiliar-list2 replace-item num-item auxiliar-list2 (item num-item auxiliar-list2 - 5)
      show mylist
      show auxiliar-list1
      show auxiliar-list2
    ]
 ]  
end

<>你自己的答案是好的,但以下是我认为是一种更优雅的方式:

print lput (map [ [ a b ] ->
  ifelse-value (a = b) [ b ] [ b - 5 ]
] (item 0 mylist) (item 2 mylist)) but-last mylist
这里的关键原语是,
foreach
of的
ask
:它不在每个元素上运行命令,而是运行一个报告器并根据结果构建一个新列表。在这种特殊的情况下,它可以避免索引和替换项目的麻烦


lput
but last
的组合可以轻松替换主列表中的最后一个子列表,但也可以使用
replace item
。或者,根据您的需要,您可以直接使用
map
的结果,而不是将其放回主列表中。

NB:所有列表的长度都相同,我不能使用表或数组扩展。您解决问题的方法显然更好,我已经在我的模型中使用了它。