我试图了解如何操作Netlogo表。鉴于以下内容:
extensions [table]
globals [t]
to test
set t table:make
table:put t 1 [[50 1] [55 2]]
table:put t 2 [[20 3] [15 4]]
table:put t 3 [[35 4] [45 5] [50 6]]
end
产生下表:
1, 50, 1
1, 55, 2
2, 20, 3
2, 15, 4
3, 35, 4
3, 45, 5
3, 50, 6
请问我该如何做?
谢谢。
答案 0 :(得分:2)
尽管名称table
暗示了什么,但从行和列的角度考虑它是错误的。 table
扩展名为您提供了一种数据结构,通常称为"字典"或者"哈希映射":它将键与值相关联。
在您的示例中,键是数字,值是数字列表的列表。以任何其他方式思考它都可能导致混淆。
话虽如此,以下是您将如何完成您所询问的操作:
; Access the value 50 in the first row (or any other
; single value in the table) on its own?
print first first table:get t 1
; Access the values 50 and 55 (i.e. all values in column 2 given
; the first column (the key) = 1)? Could I get these as a list?
print map first table:get t 1
; Delete the first row altogether?
table:put t 1 but-first table:get t 1
print t
; Delete the first two rows (i.e delete all rows where the key = 1)
table:remove t 1
print t
; Add a row: 1, 25, 6
let current-list ifelse-value ((table:has-key? t 1) and (is-list? table:get t 1)) [
table:get t 1
] [
(list) ; empty list
]
table:put t 1 lput [25 6] current-list
print t
结果:
50
[50 55]
{{table: [[1 [[55 2]]] [2 [[20 3] [15 4]]] [3 [[35 4] [45 5] [50 6]]]]}}
{{table: [[2 [[20 3] [15 4]]] [3 [[35 4] [45 5] [50 6]]]]}}
{{table: [[2 [[20 3] [15 4]]] [3 [[35 4] [45 5] [50 6]]] [1 [[25 6]]]]}}
请注意,这看起来不像是操纵行和列。
另请注意,对于上一次操作,我会检查是否已存在与密钥1
关联的内容。在这种特殊情况下,没有任何东西,因为我们刚删除它,但代码显示了如果需要如何添加到现有列表。
最后,请注意,在添加了密钥1
的条目后,它会显示在表的末尾。 table
扩展名按插入顺序维护其键,但您可能不应该依赖它。最好将数据结构视为无序的。从概念上讲,它是与值相关联的键的集,并且集合没有特定的顺序。
print map first table:get t 1
的通用形式是什么,以获取值1和2(当key = 1时,'列' 3值)?print map item 0 table:get t 1
无法工作。print map second table:get t 1
肯定不会工作!
像map first some-list
这样的表达在一段时间后成为第二天性,但我倾向于忘记它们对每个人都不明显。它正在使用
"简洁的语法"对于匿名程序(以前称为匿名程序"任务"在NetLogo< 6.0中)。
基本上:
map first table:get t 1
相当于:
map [ my-sublist -> first my-sublist ] table:get t 1
(这是NetLogo 6.0.1语法。)
为了更明确,map
是一个记者原语,它带有两个参数:匿名记者和列表。它将列表中的每个项目传递给匿名记者,并从结果中构建新列表。如果我们想要应用于列表项的操作恰好是记者采用正确数量的参数(在本例中为一个参数),我们可以将该记者的名称直接传递给map
,它会自动变成适当的匿名记者。举一个例子,map sqrt [4 9 16]
与map [ n -> sqrt n ] [4 9 16]
相同。
现在你map item 1 table:get t 1
无法工作是正确的。在这种情况下,我们需要使用简写语法:
map [ my-sublist -> item 1 my-sublist ] table:get t 1
有关详细信息,请参阅编程指南的anonymous procedures部分。
是否有
table:put t 1 but-first table:get t 1
的通用形式可以删除第二行或第三行'?
let index 1 ; to remove the second item
table:put t 1 remove-item index table:get t 1