List 从TCL列表中提取每个第n个元素

List 从TCL列表中提取每个第n个元素,list,tcl,stride,List,Tcl,Stride,我们可以通过foreach循环提取TCL列表的第n个元素。但是有没有一行通用的TCL cmd可以做到这一点呢?类似lindex的东西,带有一个“-stride”选项。不,但您可以编写如下程序: proc each_nth {list n} { set result [list] set varlist [lreplace [lrepeat $n -] end end nth] while {[llength $list] >= $n} { set l

我们可以通过foreach循环提取TCL列表的第n个元素。但是有没有一行通用的TCL cmd可以做到这一点呢?类似lindex的东西,带有一个“-stride”选项。

不,但您可以编写如下程序:

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
文件: , , , , ,

我喜欢这样。我不会想到以这种方式使用lassign。在我的特殊情况下,n=2,所以我提出了foreach{xy}$l{lappend z$x},但对n的一个更一般的情况表示赞赏。给出了这个“可接受的答案”,因为它不涉及过程或循环,并且可以作为一个线性函数给出。