tcl基础——列表排序lsort
彻底搞定lsort,看这一篇就够啦~
整理下lsort列表排序的相关用法:在处理对次序、排列等有一定要求的数据时,相比于无限嵌套循环foreach、while等,了解如何用lsort对列表list中的元素进行排序,简单一句命令或许就事半功倍。
语法
lsort -option -option list
对列表 list 中的元素以option指定方式进行排序,并返回排序后的新列表。
默认情况下,以元素的首字符按ASCII表的字符顺序递增排序,若首字符相同,对比第二个字符,往后以此类推。
选项
option | description |
---|---|
-ascii | 以ASCII表的字符顺序递增排序,为默认排序方式。对于常见的字母和数字来说,从小到大排序如下:部分字符<0-9<A-Z<a-z。 |
lsort {a10 B2 b1 a1 a2} | |
B2 a1 a10 a2 b1 | |
-dictionary | 字典关系排序,大致与-ascii相同,递增排序,两点不同:1.忽略了大小写关系,按字母a/A到z/Z递增排序;2.把数字字符看作是数值来处理,数值从小到大递增排序。 |
lsort -dictionary {a10 B2 b1 a1 a2} | |
a1 a2 a10 b1 B2 | |
-integer | 将列表元素从字符转换为整数,并使用整数数值比较,递增排序。 |
lsort -integer {5 3 1 2 11 4} | |
1 2 3 4 5 11 | |
lsort -integer {1 2 0x5 7 0 4 -1}; ###0x5为十六进制,十进制数值为5 | |
-1 0 1 2 4 0x5 7 | |
-real | 将列表元素从字符转换为浮点数,并使用浮点数数值比较,递增排序。 |
lsort -real {5 3 1 2 11 4};###整数也按浮点数数值进行比较 | |
1 2 3 4 5 11 | |
lsort -real {.5 0.07e1 0.4 6e-1} | |
0.4 .5 6e-1 0.07e1 | |
-command cmds | 使用cmds作为比较命令。由cmds命令组成的脚本,再附加两个元素共同组成,若第一个元素大于、等于或小于第二个元素,lsort分别对应返回一个大于、等于或小于零的整数。 |
proc compare {a b} {cmds};###自定义的排序方式 | |
lsort -command compare list | |
-increasing | 按递增顺序对列表元素进行排序,默认为递增排序。 |
-decreasing | 按递减顺序对列表元素进行排序。 |
-indices | 返回排序后的元素在原列表中的索引。 |
lsort -indices {c a b};###排序后的列表{a b c},a b c分别在原列表{c a b}中的索引值为1 2 0 | |
1 2 0 | |
-index indexList | 若指定该选项,没有指定-stride选项,则列表中每个元素本身必须是一个子列表。lsort将会从每个子列表中提取第indexList个元素进行比较;若子列表中还包含子列表,则indexList还可以是索引的列表,解析方式与lindex相同,并且支持string index。 |
lsort -integer -index 1 {{First 24} {Second 18} {Third 30}};###按子列表中第二个元素的整数值递增排序; | |
{{Second 18} {First 24} {Third 30}} | |
lsort -index end-1 {{a 1 e i} {b 2 3 f g} {c 4 5 6 d h}};###按子列表中倒数第二个元素的ascii字符递增排序; | |
{c 4 5 6 d h} {a 1 e i} {b 2 3 f g} | |
-stride strideLength | 指定此选项,则将列表中strideLength个元素视为一组,若没有指定-index选项,按多组列表中的第一个元素进行排序,若指定了-index选项,按每组中-index指定索引的元素进行排序。元素在其组中始终保持相同的位置。要注意的是:列表长度必须是strideLength的整数倍,并且最小为2。即在使用时原列表至少有两个元素,并保证原列表元素个数可以被strideLength整除。 |
lsort -stride 2 {a 10 b 1 c 3} | |
{a 10 b 1 c 3} | |
lsort -stride 2 -index 1 -integer {a 10 b 1 c 3} | |
{b 1 a 10 c 3} | |
-nocase | 比较时不区分大小写。与-dictionary、-integer、-real选项同时使用时无效。 |
-unique | 如果指定了此选项,则只保留列表中找到的最后一组重复元素。 |
lsort -unique {a b c a b c a b c} | |
a b c | |
lsort -unique {{a 1} {b 1} {c 3}} | |
{{a 1} {b 1} {c 3}} | |
lsort -unique -index 1 {{a 1} {b 1} {c 3}};###按子列表中第一个元素排序,{a 1}和{b 1}重复,因此只保留了{b 1} | |
{{b 1} {c 3}} |
总结
命令到用时方恨少,需要时刻提醒自己:菜就多练,笨就多学。
参考:
https://blog.csdn.net/asty9000/article/details/89644133
https://blog.csdn.net/dulixin/article/details/2195139?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7ECtr-2-2195139-blog-89644133.235%5Ev43%5Epc_blog_bottom_relevance_base8&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7Ebaidujs_baidulandingword%7ECtr-2-2195139-blog-89644133.235%5Ev43%5Epc_blog_bottom_relevance_base8&utm_relevant_index=5