如何根据TCL中的lindex值对不同的列表进行排序

时间:2013-11-13 14:27:43

标签: linux shell scripting tcl

如何根据lindex值对不同的列表进行排序,请帮助我

Qstn:

假设我有一个数组变量调用x。

设置$ x(1)“4 5 7”

设置$ x(2)“1 3 9”

设置$ x(3)“9 1 5”

我想按列表中第一个元素的排序顺序对数组进行排序。

lindex $ x(2)0< lindex $ x(1)0< lindex $ x(3)0

所以我需要的答案是一个像$ keys_sortd

这样的新变量

echo $ keys_sorted

2 1 3

我希望我的问题很明确。请以最简单的方式帮助我

2 个答案:

答案 0 :(得分:5)

set x(1) "4 5 7"
set x(2) "1 3 9"
set x(3) "9 1 5"
set l [array get x]
puts $l
set sorted [lsort -stride 2 -index 1 $l]
puts $sorted
foreach {k v} $sorted {
        lappend result $k
}
puts $result

% tclsh8.6 sort.tcl
1 {4 5 7} 2 {1 3 9} 3 {9 1 5}
2 {1 3 9} 1 {4 5 7} 3 {9 1 5}
2 1 3

希望有所帮助;)

编辑:Pre 8.6代码

foreach {k v} [array get x] {
        lappend unsorted [list $k [lindex $v 0]]
}
puts $unsorted
set sorted [lsort -index 1 $unsorted]
puts $sorted
foreach i $sorted {
        lappend result [lindex $i 0]
}
puts $result

答案 1 :(得分:2)

@siyb有Tcl 8.6的答案。对于8.5:

% foreach {key value} [array get x] {lappend y [list $key $value]}
% set y
{1 {4 5 7}} {2 {1 3 9}} {3 {9 1 5}}
% lsort -index {1 0} $y
{2 {1 3 9}} {1 {4 5 7}} {3 {9 1 5}}
% foreach elem [lsort -index {1 0} $y] {lappend sorted_keys [lindex $elem 0]}
% set sorted_keys
2 1 3