Netlogo:从其他两个列表的关系中获取第三个列表

Netlogo:从其他两个列表的关系中获取第三个列表,netlogo,Netlogo,我想从前面两个列表的关系中提取第三个列表。以下是一个例子: 我在NetLogo中有一个进程,它输出0和1的列表,我们称之为list_a: let List_A [0 1 0 1 1 ] 0和1的位置总是根据与此问题无关的几个因素而变化 第二个列表与列表a相关,称为列表B: let List_B [“residential” “industrial” “commercial” “farmland” “preservation”] 此列表项的位置从不变化 我想获得的第三个列表是列表_B中的项目,

我想从前面两个列表的关系中提取第三个列表。以下是一个例子:

我在NetLogo中有一个进程,它输出0和1的列表,我们称之为list_a:

let List_A [0 1 0 1 1 ]
0和1的位置总是根据与此问题无关的几个因素而变化

第二个列表与列表a相关,称为列表B:

let List_B [“residential” “industrial” “commercial” “farmland” “preservation”]
此列表项的位置从不变化

我想获得的第三个列表是列表_B中的项目,其位置与列表_a中的项目的位置相对应,列表_a的项目值为1。因此,根据前面的示例,这将是一个由[“工业”“农田”“保护”]组成的列表,因为“住宅”和“商业”的位置对应于值0,因此从列表中删除

此代码输出值为1的项目列表a的位置列表,取得了一些进展:

to-report comp-positions
report filter [ i -> item i List_A = 1 ] 
n-values (length List_A) [ i -> i ] 
end

但不知道如何将其应用于列表B以获得第三个列表。

可能有一种单步方法,但可能使用映射和过滤器的组合?使用ifelse值的映射可以生成零和列表项的列表,然后过滤以删除零:

to filter-map
  let List_A [0 1 0 1 1 ]
  let List_B [ "residential" "industrial" "commercial" "farmland" "preservation"]

  print filter [ i -> i != 0 ] ( map [ [ a b ] -> ifelse-value (a = 1) [b] [0] ] List_A List_B)
end

为完整起见,还有三种方法:

print map last filter [ p -> first p = 1 ] (map list List_A List_B)

print reduce sentence (map [ [a b] -> item a (list [] b) ] List_A List_B)

print reduce [ [acc val] ->
  ifelse-value (first val = 1) [ lput last val acc ] [ acc ]
] fput [] (map list List_A List_B)
一个相当于WL的就好了。