如何根据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
我希望我的问题很明确。请以最简单的方式帮助我
答案 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