我正在尝试某些东西(在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
但是当我尝试这个时,结果将是错误的,因为我不是使用策略的一部分。
想法?
答案 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)
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
记者本身已经是我们想要的了;没有必要构建一个单独的匿名记者来做同样的事情。