Tcl 列表操作
1. 列表命令集
列表相关命令
命令 | 说明 |
list arg1 arg2 ... | 创建一个列表 |
lindex list index | 返回列表 list 中的第 index 个元素( element)值 |
llength list | 计算列表 list 元素个数 |
lrange list index1 index2 | 返回指定范围内(从 index1 到 index2)的元素 |
lappend list arg1 arg2 ... | 将新元素追加到原来列表 list 后组成新的列表 |
linsert list index arg1 arg2 ... | 将新元素插入到 list 中位于 index 元素之前的位置上 |
lreplace list index1 index2 arg1 arg2 ... | 替换指定范围的元素 |
lsearch ?mode? list value | 根据匹配模式 mode,查找 list 中与 value 匹配的元素位置索引。 mode 一般为-exact、 -glob 和- regexp.默认为-glob。找不到返回-1。 |
lsort ?switches? list | 根据 开关选项对列表进行排序 |
concat list1 list2 ... | 连接多个列表内容成一个列表 |
join list joinChars | 以 joinChars 为分隔符将列表中的元素合并在一起 |
split string splitChars | 以 splitChars 中的字符作为分隔符将字符串分解为列表元素。 |
foreach var list {proc body} | 遍历列表各项,逐次将各元素值存入 var 中并执行proc body。相当于一个循环控制语句。 |
2. list 命令
list 命令用来创建列表。一个列表可以包含子列表,即列表可以嵌套。
使用 list 命令创建列表示例:
-
set l1 [list Sun Mon Tues]
-
=> Sun Mon Tues #列表l1中含有三个元素
-
-
set l2 [list $l1 Wed]
-
=> {Sun Mon Tues} Wed #列表l2中含有两个元素。第一个元素用花括号括起来
-
-
set str1 "Sun Mon Wed"
-
=> Sun Mon Tues
-
-
set l2 [list $str1 Wed]
-
=> {Sun Mon Tues} Wed #和上面的命令相同,列表是特殊的字符串
-
-
set l1 [list "Sun Mon Tues" "Wed"]
-
=> {Sun Mon Tues} Wed #当元素是一个字符时,就被花括号括起来了
-
-
set b 10
-
set l3 [list {a $b c} d]
-
=> {a $b c} d
-
-
set l3 [list "a $b c" d]
-
=> {a 10 c} d
-
3. concat 命令
concat 命令以空格为分隔符将多个列表拼装在一起形成新的列表。它和双引号的作用比较相似。
list 命令和 concat 命令都可以完成列表合并功能。 list 和 lappend 命令保留每个列表的结构,将每个列表作为一个整体生成新列表的元素来完成。而 concat 命令则要先把各个列表的最外层列表结构去掉,将其中的所有元素取出来作为新列表的元素来完成合并,即新列表的每个元素也是合并前列表的元素。
-
set x {1 2} #花括号创建一个列表
-
=> 12
-
-
set y "$x 3" #$x被替换后,作为列表结构的花括号被去掉
-
=> 1 2 3
-
-
set y "$x {3}"
-
=> 1 2 {3}
-
-
set y [concat $x 3] #结构同“”的作用一样
-
=> 1 2 3
-
-
set y [concat $x {3}]
-
=> 1 2 3
-
-
set y [list $x 3]
-
=> {1 2} 3
-
-
set y [list $x {3}]
-
=> {1 2} 3
-
-
set y [lappend x 3]
-
=> {1 2} 3
-
4. lappend 命令
lappend 命令用来将新元素追加到列表末尾。
lappend 命令简单例子:
-
lappend new 1 2 #lappend命令也可以用来创建一个列表
-
=> 1 2
-
-
lappend new {3 4} "5" {6} 7 #单个元素的双引号和花括号被剥离了
-
=> 1 2 {3 4} 5 6 7
-
-
set new
-
=> 1 2 {3 4} 5 6 7
-
5. llength 命令
llength 命令可以获得一个列表内元素的个数。
llength 命令的一个简单例子:
-
set l1 "1 2 3 4 5"
-
=> 1 2 3 4 5 # 定义了一个字符串
-
-
set num [llength $l1] #这里l1被看成列表了
-
=> 5
-
列表是用空格搁开的多个元素组成的字符串,而通过 list 相关命令得到了特殊解释。既然 list是字符串,那么所有适用于字符串的操作命令也应该适用于列表。
6. lindex 命令
lindex 命令返回列表中指定位置的特定元素。列表索引从 0 开始记数!
lindex 命令的一个简单例子:
-
set x {1 4 5}
-
=> 1 4 5
-
-
lindex $x 1
-
=> 4
-
-
lindex $x end
-
=> 5
-
-
lindex $x end-1
-
=> 4
-
-
lindex $x first
-
=> bad index "first" : must be interer or end
-
7. lrange 命令
lrange 命令返回一个指定区段的列表元素,可以以 end 或者 end-n 作为索引(n 为正整数)。
-
lrange {1 2 3 {4 5} 6} 2 end
-
=> 3 {4 5 } 6
-
8. linsert 和 lreplace 命令
linsert 命令用来将元素插入到一个列表的由索引指定的位置。如果索引为 0 或者更小,则元素就会被添加到最前面。如果索引值大于或者等于列表长度,则元素被追加到列表尾部。其他情况元素被添加到指定位置之前。
lreplace 命令将一个指定区段的列表元素替换为新元素。如果没有指定新元素,则这个区域的元素就会被从列表中删除。
-
set x {1 2}
-
=> 1 2
-
-
set new [linsert $x 0 he she]
-
=> he she 1 2
-
-
set new [linsert $x end he she]
-
=> 1 2 he she
-
-
set new [linsert $x 1 he she]
-
=> 1 he she 2
-
-
puts $x
-
=> 1 2
-
-
puts $new
-
=> 1 he she 2
-
-
set y [lreplace $ new 1 2 B C]
-
=> 1 B C 2
-
-
set y [lreplace $ new 0 0]
-
=> he she 2
-
-
puts $ new
-
=> 1 he she 2
-
-
set y [lreplace $new 1 2]
-
=> 1 2
-
9. lsearch 命令
lsearch 命令在给定列表中搜索与匹配字符串匹配的元素,成功就返回正确的元素索引,否则返回-1。 lsearch 支持通配符格式,但可以使用-exact 选项将其屏蔽而进行精确匹配。
-
set l1 [list This is one list]
-
=> This is one list
-
-
set index [lsearch $l1 l*]
-
=> 3
-
-
set index [lsearch -exact $l1 l*]
-
=> -1
-
-
set index [lsearch -exact $l1 list]
-
=> 3
-
10. lsort 命令
lsort 命令实现对列表的排序。排序操作不影响原表,而是返回排序之后的新表。
排序的方式有多种选择,可以通过-ascii、 -dictionary 、 –integer、 -real 来指定基本排序类型,然后使用-increasing、 decreasing 指定排列方式,默认为-ascii、 -increasing 。要注意ASCII 排序时使用字符编码;而 dictionary 排序方式整合大小写,并将包含的数字以数值大小来处理。
-
set list "a Z z n100 n200 M p HI hL m 1 20"
-
=> a Z z n100 n200 M p HI hL m 1 20
-
-
lsort -ascii $list
-
=> 1 20 HI M Z a hL m n n100 n200 p z
-
-
lsort -dictionary $list
-
=> 1 20 a HI hL M m n n100 n200 p Z z
-
11. join 与 split 命令
join 命令接收一个列表,并用指定的分隔符将列表元素整合成一个字符串。
- join {1 {2 3} {4 5 6}} :
- => 1:2 3 : 4 5 6
split 命令的作用与 join 的作用相反,它接收一个字符串,并根据给定的字符将其分割转换成一个列表。用于分割的字符应该在字符串中存在,否则 split 因为没有搜索到对应字符而将整个字符串作为唯一列表元素而返回,即返回原字符串。
12. foreach 控制结构
foreach 命令/控制结构会遍历整个列表,逐次取出列表的每个元素的值放到指定变量中,使用者可以在跟随的过程体中添加必要的处理过程。
-
set l1 [list This is one list]
-
=> This is one list
-
foreach elem $l1 {
puts "---$elem---"
}
=> ---This---
---is---
---one---
---list---
本例 foreach 在每次循环进行时,依次将列表 l1 中的一个元素值赋值给 elem 变量。foreach 命令还可以同时对多个列表进行操作,而且还可以同时操作同一列表的多个元素。如果在最后一次循环之前就遍历完了某个列表,则与之对应的循环变量就会以空字符串来赋值。
foreach {x1 x2} {Orange Blue Red Green Black} x3 {Right Left Up Down} {
puts [format "x1=%8s x2=%8s x3=%8s"
}
=> x1= Orange x2= Blue x3= Right
x1= Red x2= Green x3= Left
x1= Black x2= x3= Up
x1= x2= x3= Down
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!