tcl lsort表示字符串中的最后n个字符

时间:2015-02-19 22:10:47

标签: tcl

寻找一种通过n个最后一个字符来输入字符串列表的方法。

期望的结果:

lsort -lastchars 3 {123xyz 456uvw 789abc}
789abc 456uvw 123xyz 

我的后退位置是使用-command选项并写我的proc丢弃除最后3个字符以外的所有字符。

谢谢, 格特

2 个答案:

答案 0 :(得分:2)

你的后备想法是实现这一目标的方法。

proc f {lhs rhs} {
    return [string compare [string range $lhs end-2 end] \
        [string range $rhs end-2 end]]
}
lsort -command f {123xyz 456uvw 789abc}

返回

789abc 456uvw 123xyz

答案 1 :(得分:2)

快速执行此操作的方法是计算归类键并对其进行排序。排序规则键只是一个按您想要的顺序排序的字符串;你用真实值对它们进行打包以对它们进行排序和排序。

set yourList {123xyz 456uvw 789abc}
set withCKs {}
foreach value $yourList {
    lappend withCKs [list $value [string range $value end-2 end]]
}
set sorted {}
foreach pair [lsort -index 1 $withCKs] {
    lappend sorted [lindex $pair 0]
}

在Tcl 8.6中可以做得更优雅:

set sorted [lmap pair [lsort -index 1 [lmap val $yourList {list $val [string range $val end-2 end]}]] {lindex $pair 0}]

为了清晰起见,拆开单线:

# Add in the collation keys
set withCKs [lmap val $yourList {list $val [string range $val end-2 end]}]
# Sort by the collation keys and then strip them from the result list
set sorted [lmap pair [lsort -index 1 $withCKs] {lindex $pair 0}]

另一种方法是在单独的列表中生成排序规则键,然后让lsort吐出排序时产生的索引。

set CKs [lmap val $yourList {string range $val end-2 end}]
set sorted [lmap idx [lsort -indices $CKs] {lindex $yourList $idx}]

作为一个单行:

set sorted [lmap idx [lsort -indices [lmap val $yourList {string range $val end-2 end}]] {lindex $yourList $idx}]

对于Tcl 8.5(8.4或之前没有-indices选项):

set CKs [set sorted {}]
foreach val $yourList {
    lappend CKs [string range $val end-2 end]
}
foreach idx [lsort -indices $CKs] {
    lappend sorted [lindex $yourList $idx]
}

foreach / lappend模式正是lmap在8.6中改进的模式。)

相关问题