我有一个列表,它是一个键值配对列表。类似于以下内容
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中有这么简单的方法吗?
答案 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