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

How to match a value of a list of numbers to item from a list of names in netlogo?

我正在尝试一些东西(在 netlogo 中),但它不起作用。我想要一个数字列表中的位置值。我想使用其中的数字从名称列表中检索名称。

因此,如果我有一个像 [1 2 3 4] 这样的列表,然后是一个包含 ["chicken" "duck" "monkey" "dog"] 的列表 我希望我的数字 2 对应于 "duck".

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

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

但是当我尝试这样做时,结果将是错误的,因为 l 不是 usedstrategies 的一部分。

想法?

您需要 item 原语到 select 在匹配另一个列表后。我不确定 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

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 中没有键的项目(例如,table:get strategies 9),您将收到以下错误:

Extension exception: No value for 9 in table.

这里更详细地介绍了代码的工作原理。

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

为了构造我们的列表列表,我们使用 map 原语。这部分有点难以理解。 map 原语需要两种输入:一个或多个列表,以及一个应用于这些列表元素的报告器。记者在前,整个表达式要在括号内:

(map list zq usedstrategies)

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

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

注意压缩表达式也可以写成:

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

...但这是一种更迂回的方式。 list 记者本身就是我们想要的;不需要构建一个单独的匿名报告者来做同样的事情。