NetLogo:如何比较两个子列表

时间:2018-05-18 11:09:50

标签: list compare netlogo sublist

我不是来自计算机科学背景,而且我也是NetLogo的新手,所以我非常感谢你的帮助。我的问题如下:

假设我有三个列表的列表

Let mylist [ [ 1 2 3 4 5 ] [ 2 2 2 2 2 ] [ 3 3 3 3 3 ] ]

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

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

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

提前致谢,

2 个答案:

答案 0 :(得分:2)

你自己的答案很好,但我认为这是一种更优雅的方式:

print lput (map [ [ a b ] ->
  ifelse-value (a = b) [ b ] [ b - 5 ]
] (item 0 mylist) (item 2 mylist)) but-last mylist

这里的关键原语是mapforeachofask的内容:而不是在每个元素上运行命令,它运行一个记者和从结果中构建一个新列表。在这种特殊情况下,它可以避免使用索引和内部replace-item混乱。

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

答案 1 :(得分:1)

我设法通过分离子列表来解决问题:

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