如何将数字列表的值与netlogo中的名称列表中的项匹配?

时间:2018-03-24 18:52:28

标签: netlogo

我正在尝试某些东西(在netlogo中),但它无效。我想从一个数字列表中获取一个位置的值。我希望使用它出来的数字从名单列表中检索名称。

所以如果我有一个像[1 2 3 4]这样的清单,那就是[“鸡”“鸭子”“猴子”“狗”的清单] 我希望我的2号与“鸭子”对应。

到目前为止,我的zq是一个数字列表,我的usedstrategies是一个名单。

let m precision (max zq) 1
let l position m zq
let p (position l zq) usedstrategies

但是当我尝试这个时,结果将是错误的,因为我不是使用策略的一部分。

想法?

2 个答案:

答案 0 :(得分:3)

在匹配其他列表后,您需要item原语从列表中进行选择。我不确定precision行的用途。但是,这是一段自包含的代码,我认为它代表了你想要做的事情。请注意,NetLogo从0开始计算位置,而不是1.我还在列表中使用了任意数字,这样您就不会对列表中的数字和它的位置感到困惑。

to testme
  let usedstrategies (list "chicken" "duck" "monkey" "dog")
  let zq (list 5 6 7 8)
  let strategynum position 7 zq
  let thisstrategy item strategynum usedstrategies
  type "Selected strategy number " type strategynum
    type " which is " print thisstrategy
end

答案 1 :(得分:2)

Jen的解决方案完全没问题,但我认为这也可能是table extension的一个很好的用例。这是一个例子:

extensions [table]

to demo

  let usedstrategies ["chicken" "duck" "monkey" "dog"]
  let zq [5 6 7 8]  
  let strategies table:from-list (map list zq usedstrategies)  

  ; get item corresponding with number 7:
  print table:get strategies 7

end

A" table",这里是一组数据结构,其中一组键与值相关联。在这里,您的数字是关键,策略是价值。

如果您尝试获取表格中没有密钥的项目(例如table:get strategies 9),您将收到以下错误:

  

扩展例外:表中没有9的值。

以下是有关代码如何工作的更多细节。

要构建表,我们使用table:from-list报告器,它将列表列表作为输入,并返回一个表,其中每个子列表的第一项用作键,第二项用于作为一种价值。

要构建列表列表,我们使用map原语。理解这部分有点棘手。 map原语需要两种输入:一个或多个列表,以及要应用于这些列表元素的报告器。记者来到第一位,整个表达需要在括号内:

(map list zq usedstrategies)

此表达式"拉链"我们将两个列表放在一起:它取zq的第一个元素和usedstrategies的第一个元素,将它们传递给list报告者,后者用这两个元素构造一个列表,并添加结果到一个新的列表。然后它接受zq的第二个元素和usedstrategies的第二个元素并对它们做同样的事情,直到我们有一个看起来像这样的列表:

[[5 "chicken"] [6 "duck"] [7 "monkey"] [8 "dog"]]

请注意,也可以编写压缩表达式:

(map [ [a b] -> list a b ] zq usedstrategies)

......但这是一种更为迂回的方式。 list记者本身已经是我们想要的了;没有必要构建一个单独的匿名记者来做同样的事情。