我有三个清单:
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',但是
没有找到先验相关的命令。
答案 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
是一个映射命令,它从一个或多个列表中获取元素并执行脚本。它创建一个新列表,其中每个元素都是一次执行脚本的结果。
此命令已添加到Tcl 8.6中,但可以轻松添加到早期版本中。
答案 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}}
}