1

如何根据它们的 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

回声 $keys_sorted

2 1 3

我希望我的问题很清楚。请帮我用最简单的方法

4

2 回答 2

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

希望有帮助;)

编辑: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
于 2013-11-13T15:11:13.487 回答
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
于 2013-11-13T15:36:26.903 回答