如何操作网络表中的元素?

时间:2017-04-25 09:03:01

标签: netlogo

我试图了解如何操作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

请问我该如何做?

  1. 自行访问第一行中的值50(或表中的任何其他单个值)?
  2. 访问值50和55(即第一列(密钥)= 1时第2列中的所有值)?我可以将这些作为清单吗?
  3. 完全删除第一行?
  4. 删除前两行(即删除key = 1的所有行)
  5. 添加一行:1,25,6
  6. 谢谢。

1 个答案:

答案 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