gpt4 book ai didi

tcl lsort 对字符串中的最后 n 个字符

转载 作者:行者123 更新时间:2023-12-02 21:19:18 32 4
gpt4 key购买 nike

寻找一种按最后 n 个字符对字符串列表进行排序的方法。

期望的结果:

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

我的后退立场是使用 -command 选项并编写我的过程,丢弃除最后 3 个字符之外的所有字符。

谢谢,格特

最佳答案

实现此目的的一种快速方法是计算排序键并对其进行排序。排序规则键只是一个按您想要的顺序排序的字符串;你将它们与实际值打包在一起进行排序和排序。

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 中改进的。)

关于tcl lsort 对字符串中的最后 n 个字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28618005/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com