从 TCL 列表中提取每个第 n 个元素
Extract every n-th element from TCL list
我们可以通过 foreach 循环提取 TCL 列表的每个第 n 个元素。但是是否有单行通用 TCL cmd 可以解决问题?类似于带有“-stride”选项的 lindex。
不,但你可以像这样写一个过程:
proc each_nth {list n} {
set result [list]
set varlist [lreplace [lrepeat $n -] end end nth]
while {[llength $list] >= $n} {
set list [lassign $list {*}$varlist]
lappend result $nth
}
return $result
}
然后:
each_nth {a b c d e f g h i j k l} 3 ;# => c f i l
each_nth {a b c d e f g h i j k l} 4 ;# => d h l
each_nth {a b c d e f g h i j k l} 5 ;# => e j
如果你有 lmap
(下面链接中的 Tcl 8.5 版本),你可以这样做:
lmap [lrepeat $n a] $list {set a}
示例:
set list {a b c d e f g h i j k l}
set n 2
lmap [lrepeat $n a] $list {set a}
# => b d f h j l
但是您的评论似乎表明您确实想要第 n+1 个值。在那种情况下:
lmap [lreplace [lrepeat $n b] 0 0 a] $list {set a}
# => a c e g i k
我们可以通过 foreach 循环提取 TCL 列表的每个第 n 个元素。但是是否有单行通用 TCL cmd 可以解决问题?类似于带有“-stride”选项的 lindex。
不,但你可以像这样写一个过程:
proc each_nth {list n} {
set result [list]
set varlist [lreplace [lrepeat $n -] end end nth]
while {[llength $list] >= $n} {
set list [lassign $list {*}$varlist]
lappend result $nth
}
return $result
}
然后:
each_nth {a b c d e f g h i j k l} 3 ;# => c f i l
each_nth {a b c d e f g h i j k l} 4 ;# => d h l
each_nth {a b c d e f g h i j k l} 5 ;# => e j
如果你有 lmap
(下面链接中的 Tcl 8.5 版本),你可以这样做:
lmap [lrepeat $n a] $list {set a}
示例:
set list {a b c d e f g h i j k l}
set n 2
lmap [lrepeat $n a] $list {set a}
# => b d f h j l
但是您的评论似乎表明您确实想要第 n+1 个值。在那种情况下:
lmap [lreplace [lrepeat $n b] 0 0 a] $list {set a}
# => a c e g i k