Разделить список чисел на меньший список на основе диапазона в TCL - PullRequest
0 голосов
/ 29 августа 2018

У меня есть отсортированный список чисел, и я пытаюсь разделить список на меньшие списки на основе диапазона от 50 и найти среднее значение в TCL.

Например: set xlist {1 2 3 4 5 ...50 51 52 ... 100 ... 101 102}

разделенные списки: {1 ... 50} { 51 .. 100} {101 102}

результат: sum(1:50)/50; sum(51:100)/50; sum(101:102)/2

1 Ответ

0 голосов
/ 29 августа 2018

Команда 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 является выражением вместо скрипта.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...