Tcl 中 N 个列表中 elements/numbers 的总和?

Sum of elements/numbers in N lists in Tcl?

如何从 tcl 中的 n 个列表中添加 elements/numbers? 我已经在 python 中尝试过,它使用以下方法工作:

[sum(x) for x in zip(*C)]

如何在 tcl 中执行此操作? tcl有zip功能吗?

还有其他方法可以实现吗?

我现在有 2 个列表:

l1 {11 333 4 567 129}
l2 {23 47 56 10 13}

我可以有 N 个列表

我需要从这些列表中 return 逐元素求和。

对于我在下面实现的两个列表:

set result {}
foreach x $l1 y $l2 {
    lappend result [expr {$x + $y}]
}

我担心的是:我可以有一个或多个列表。那么在那种情况下我该如何实施?

获取两个列表元素的成对和的新列表:

set result [lmap a $list1 b $list2 { expr {$a + $b} }]

对三个列表、四个列表等进行明显的添加

据我所知,在 Tcl 中没有类似于 zip 的函数。但是,您可以根据需要创建一个。粗略的可能是这样的:

proc zip {lists} {
    set result {}

    for {set i 0} {$i < [llength [lindex $lists 0]]} {incr i} {
        set elem {}
        foreach list $lists {
            if {$i >= [llength $list]} {return $result}
            lappend elem [lindex $list $i]
        }
        lappend result $elem
    }
    return $result
}

那么你可以这样使用它:

set l1 {11 333 4 567 129}
set l2 {23 47 56 10 13}

set ln [list $l1 $l2]

set sum [lmap x [zip $ln] {::tcl::mathop::+ {*}$x}]
# 34 380 60 577 142

Then you don't want a variable per list, you want something else like a list of lists.

这是我对肖恩上述推荐的看法:

set l1 {11 333 4 567 129}
set l2 {23 47 56 10 13}

lappend l $l1 $l2

proc zippedSum {p} {
    set inner [llength [lindex $p 0]]
    set result [list]
    for {set i 0} {$i < $inner} {incr i} {
       lappend result [::tcl::mathop::+ {*}[lmap sublist $p {lindex $sublist $i}]]
    }
    return $result
}

zippedSum $l

您不会维护单独的变量,而是维护列表的列表 (l)。然后,您将处理每个索引的子列表(最大索引由第一个子列表确定),使用其他地方推荐的 来进行压缩。