首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NetLogo:如何使用引用相应列表的标准对列表进行筛选?

NetLogo:如何使用引用相应列表的标准对列表进行筛选?
EN

Stack Overflow用户
提问于 2017-03-18 16:54:56
回答 1查看 628关注 0票数 2

我的情况:在NetLogo中有两个列表,它们被认为是相互对应的,例如是矩阵的两行。

例如

代码语言:javascript
复制
set list-1 [1 2 2]
set list-2 [13 7 8]

其中1被认为与13配对,2与7配对,2与8配对。

我的问题:

我想通过对list-1的相应元素应用一个标准来筛选list-2。例如,如果相应的项等于2,则保留列表-2中的一项。

其结果应该是:

清单-2:[7 8]

其中,由于对应的1不等于2,所以删除了13。

如何在NetLogo中编程呢?

My NetLogo版本: 5.3.1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-18 20:33:42

我可以想出许多不同的方法来做到这一点:

代码语言:javascript
复制
to go
  let list-1 [1 2 2]
  let list-2 [13 7 8]

  ; the most straightforward, imperative way:
  let list-3 []
  (foreach list-1 list-2 [
    if ?1 = 2 [ set list-3 lput ?2 list-3 ]
  ])
  print list-3

  ; an uglier imperative version using indices:
  let list-4 []
  let i 0
  while [ i < length list-1 ] [
    if item i list-1 = 2 [ set list-4 lput item i list-2 list-4 ]
    set i i + 1
  ]
  print list-4

  ; using reduce, sentence and map:
  print reduce sentence (map [
    ifelse-value (?1 = 2) [ ?2 ] [ [] ]
  ] list-1 list-2)

  ; using map, filter, and indices:
  print map [ item ? list-2 ] filter [
    item ? list-1 = 2
  ] n-values length list-1 [ ? ]    

  ; another variant using `filter`:
  print map last filter [ first ? = 2 ] (map list list-1 list-2)

end

最后一个是我最喜欢的,因为我认为它比其他的更好地表达了意图,但这可能是主观的。

为了使事物可重用,您可以在一个记者中隔离您喜欢的方法:

代码语言:javascript
复制
to-report filtered-by-first-list [ filtering-task list-1 list-2 ]
  report map last filter [
    (runresult filtering-task first ?)
  ] (map list list-1 list-2)
end

然后你可以这样称呼它:

代码语言:javascript
复制
observer> show filtered-by-first-list task [ ? = 2 ] [1 2 2] [13 7 8]
observer: [7 8]

将所有这些转换为NetLogo 6语法是留给读者的练习。:-)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42877203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档