NetLogo:如何比较两个子列表
NetLogo: How to compare two sublists
我不是计算机科学出身,也是 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 ] ]
提前致谢,
我设法通过分离子列表解决了问题:
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
这里的关键原语是 map
,它对 foreach
就像 of
对 ask
一样:而不是 运行 每个元素上的命令,它运行一个报告器并根据结果构建一个新列表。在这种特殊情况下,它使您不必在内部弄乱索引和 replace-item
。
lput
和 but-last
的组合可以轻松替换主列表中的最后一个子列表,但您也可以使用 replace-item
。或者,根据您的需要,您可以直接使用 map
的结果,而不是将其放回主列表中。
我不是计算机科学出身,也是 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
.
换句话说,我想将 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
这里的关键原语是 map
,它对 foreach
就像 of
对 ask
一样:而不是 运行 每个元素上的命令,它运行一个报告器并根据结果构建一个新列表。在这种特殊情况下,它使您不必在内部弄乱索引和 replace-item
。
lput
和 but-last
的组合可以轻松替换主列表中的最后一个子列表,但您也可以使用 replace-item
。或者,根据您的需要,您可以直接使用 map
的结果,而不是将其放回主列表中。