按值对 Tcl 字典进行排序

4
我在想在Tcl中是否有一种优雅的方法按值对字典进行排序。
假设我有以下字典:
set d1 [dict create k1 10 k2 89 k3 1 k4 15 k5 20]
# Results in dict of form
# k1 => 10
# k2 => 89
# k3 => 1
# k4 => 15
# k5 => 20

现在我想对这个字典进行排序,以便我得到:
# k3 => 1
# k1 => 10
# k4 => 15
# k5 => 20
# k2 => 89

我希望有类似于Python中sorted()函数的东西。
1个回答

14

如果您有Tcl 8.6(这是因为可以将字典便宜地转换为列表),则可以这样做:

set sorted [lsort -integer -stride 2 -index 1 $d1]

如果您仍在使用8.5版本(很可能,8.6版本仍处于测试阶段),则需要执行多个步骤:

proc sortDictByValue {dict args} {
    set lst {}
    dict for {k v} $dict {lappend lst [list $k $v]}
    return [concat {*}[lsort -index 1 {*}$args $lst]]
}
set sorted [sortDictByValue $d1]

如果你有-stride选项,那么使用起来更容易。


1
谢谢!在8.6中,lsort的-stride选项看起来非常有用。 - Malcolm32
2
匿名用户评论:我认为应该添加-integer,否则值将按字典顺序排序。例如:set sorted [lsort -integer -stride 2 -index 1 $d1] - Anne
1
@Anne:这限制了“sorted”的含义;提问者在表达意思时并不是非常精确。 - Donal Fellows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接