如何" zip"列表中的tcl

时间:2015-08-20 12:33:37

标签: list tcl

我有三个清单:

set l1 {1 2 3}
set l2 {'one' 'two' 'three'}
set l3 {'uno' 'dos' 'tres'}

我想建立这个清单:

{{1 'one' 'uno'} {2 'two' 'dos'} {3 'three' 'tres'}}

python中,我会使用类似内置函数zip的内容。我应该在tcl做什么?我查看了documentation of 'concat',但是 没有找到先验相关的命令。

3 个答案:

答案 0 :(得分:5)

如果你还没有使用Tcl 8.6(你可以使用lmap),你需要这个:

set zipped {}
foreach a $l1 b $l2 c $l3 {
    lappend zipped [list $a $b $c]
}

这实际上是lmap为你做的,但它是8.6中的新功能。

答案 1 :(得分:4)

lmap a $l1 b $l2 c $l3 {list $a $b $c}

列表映射lmap是一个映射命令,它从一个或多个列表中获取元素并执行脚本。它创建一个新列表,其中每个元素都是一次执行脚本的结果。

文档:listlmap

此命令已添加到Tcl 8.6中,但可以轻松添加到早期版本中。

Getting lmap for Tcl 8.5 and earlier

答案 2 :(得分:3)

这是一个采用任意数量的列表名称的版本:

set l1 {a b c}
set l2 {d e f}
set l3 {g h i j}

proc zip args {
    foreach l $args {
        upvar 1 $l $l
        lappend vars [incr n]
        lappend foreach_args $n [set $l]
    }
    foreach {*}$foreach_args {
        set elem [list]
        foreach v $vars {
            lappend elem [set $v]
        }
        lappend result $elem
    }
    return $result
}

zip l1 l2 l3
{a d g} {b e h} {c f i} {{} {} j}

{*}参数扩展需要Tcl 8.5。

8.6版本

proc zip args {
    foreach l $args {
        upvar 1 $l $l
        lappend vars [incr n]
        lappend lmap_args $n [set $l]
    }
    lmap {*}$lmap_args {lmap v $vars {set $v}}
}