Команда lrange
- это то, что вам нужно здесь. В сочетании с циклом for
это даст вам разделение, которое вы хотите.
proc splitByCount {list count} {
set result {}
for {set i 0} {$i < [llength $list]} {incr i $count} {
lappend result [lrange $list $i [expr {$i + $count - 1}]]
}
return $result
}
Тестирование, которое в интерактивном режиме (с меньшим входным набором данных) выглядит хорошо для меня:
% splitByCount {a b c d e f g h i j k l} 5
{a b c d e} {f g h i j} {k l}
Остальное, что вам нужно, - это тривиальное приложение lmap
и tcl::mathop::+
(форма команды оператора выражения +
).
set sums [lmap sublist [splitByCount $inputList 50] {
expr {[tcl::mathop::+ {*}$sublist] / double([llength $sublist])}
}]
Мы можем сделать это немного лучше, определив пользовательскую функцию:
proc tcl::mathfunc::average {list} {expr {
[tcl::mathop::+ 0.0 {*}$list] / [llength $list]
}}
set sums [lmap sublist [splitByCount $inputList 50] {expr {
average($sublist)
}}]
(я переместил команду expr
на предыдущую строку в двух случаях, чтобы я мог притвориться, что тело процедуры / lmap
является выражением вместо скрипта.)