将键值列表分配给Tcl中的数组

时间:2017-03-09 03:47:37

标签: tcl

我有一个列表,它是一个键值配对列表。类似于以下内容

key1 value1 key2 value2 key3 value3

我想将其映射到数组或字典。

目前,我的代码看起来像这样

for {set i 0} {$i < [llength $list]} {incr i} {
  if {[expr {fmod($i,2)}] == 0} {
    set key [lindex $list $i]
  } else {
    set v_array(${key}) [lindex $list $i]
  }
}

在perl中,我知道这可以在一次传递中分配到键值字典中。在Tcl中有这么简单的方法吗?

3 个答案:

答案 0 :(得分:6)

您可以在一行中创建一个数组(我使用一行来定义列表):

% set list [list key1 value1 key2 value2 key3 value3]
key1 value1 key2 value2 key3 value3
% array set v_array $list

如果你想检查内容,你可以使用parray(Tcl 8.5及更高版本):

% parray v_array
v_array(key1) = value1
v_array(key2) = value2
v_array(key3) = value3

可以找到其他数组命令的文档here,并为每个命令提供示例。

如果你以某种方式无法避免循环,那么使用foreach将更容易(确保列表具有偶数个元素):

foreach {a b} $list {
  set v_array($a) $b
}

(此处foreach一次将$list中的元素分为两个,并将它们分配给a和b)

答案 1 :(得分:1)

您可以使用dict命令在Tcl中创建/操作词典。

% set mydict [dict create key1 value1 key2 value2 key3 value3]
key1 value1 key2 value2 key3 value3
% dict get $mydict
key1 value1 key2 value2 key3 value3
% dict get $mydict key3
value3
% dict get $mydict key1
value1
%

即使没有dict create命令,您也可以直接从列表中获取/访问键和值,只要它是键值形式即可。即偶数个元素。

例如,

% set mylist {key1 value1 key2 value2 key3 value3}
key1 value1 key2 value2 key3 value3
% dict get $mylist key2
value2

您可以注意到,我这里没有使用dict create命令,但仍然可以访问字典项。

参考: dict

答案 2 :(得分:0)

最简单的解决方案:

set mylist {key1 value1 key2 value2 key3 value3}
array set arr $mylist

多数民众赞成。

现在,做一个检查。

file:t3

#
set list [list key1 value1 key2 value2 key3 value3]
array set arr $list
parray arr
#

Execute the file: tclsh t3
arr(key1) = value1
arr(key2) = value2
arr(key3) = value3