Tcl列表命令之lmap、lrange、lrepeat、lreverse

lmap

lmap varname list body
lmap varlist1 list1 ?varlist2 list2 ...varlistN listN? body

lmap是Tcl8.6新增的命令,遍历一个或多个列表中的所有元素并收集结果。在最简单的情况下,只有一个循环变量varname,和一个列表list,list中的值会依次分配给变量varname,body是一个Tcl脚本。lmap像使用lindex命令一样来提取元素分配给varname,然后调用Tcl解释器来执行body。如果主体的执行正常完成,则body的结果追加到累加器列表中,lmap最后返回累加器列表。如果body中最后一个命令返回值为空,则lmap的返回结果为所有值均为空值的列表。由此更一般的情况是,有多个列表list1、list2...listN,每个列表的值会分配给对应的循环变量varlist1、varlist1...varlistN。迭代次数为所有列表的最大长度。如果列表没有足够的值分配给循环变量,则会将空值分配给循环变量。break和continue语句可以在body内部调用,与for和foreach命令中的效果相同。这种情况下,body不能正常完成,结果不会追加到累加器列表中。

set list1 {1 2 3 4 5}
set list2 {a b c d e f}
set list3 {A B C}
set map1 [lmap v1 $list1 v2 $list2 v3 $list3 {list $v1 $v2,$v3}]
puts $map1
set map2 [lmap v1 $list1 v2 $list2 v3 $list3 {expr {$v1!=""?[list $v1 $v2,$v3]:[continue]}}]
puts $map2

lrange

lrange list first last

从列表中返回一个或多个相邻元素。list必须是一个有效的Tcl列表。返回一个包含list中索引从first到last的新的列表。fisrt和last的解析与string index命令相同,支持简单的索引计算以及相对于列表末尾的索引计算。first与last的不同值会导致不同的行为,如下表:

firstlast行为
小于0小于0返回空值。
小于0大于等于0从0到last索引处的元素。
大于0小于first返回空值。
大于0大于等于first返回从first到last索引处的元素。
大于等于列表元素数量 返回空值。
set list1 {a b c d e}
lrange $list1 -1 -2
lrange $list1 -1 3
lrange $list1 4 3
lrange $list1 1 3
lrange $list1 5 3
lrange $list1 end-2 end

lrepeat

lrepeat number element1 ?element2...elementN ?

通过重复元素构建列表,lrepeat命令通过重复number次元素序列element1 element2...elementN,创建一个长度为number*element数量的列表。 number必须是整数,element可以是任何Tcl值。number为1时与与list命令等价。

lrepeat 3 a b c
lrepeat 3 [ lrepeat 2 a b] c

lreverse

lreverse list

反转列表的顺序,返回一个新的与输入列表list顺序相反的列表,不改变输入列表。

set list1 {a d c b {g e} f}
lreverse $list1
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值