2017-03-09 46 views
1

我有一個列表,它是一個鍵值對列表。類似以下內容將鍵值列表分配給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中有更簡單的方法嗎?

回答

5

您可以創建一個線陣列(我用一條線來定義列表):

% 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)

+0

謝謝,這看起來像什麼,我一直在尋找。 – Jonjilla

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

1

最簡單的解決方案:

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

就是這樣。

現在,做一個parray檢查。

文件: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