2013-10-02 2 views

ответ

1

Вот один метод, должен работать в любой версии Tcl

proc partition {lst size} { 
    set partitions [list] 
    while {[llength $lst] != 0} { 
     lappend partitions [lrange $lst 0 [expr {$size - 1}]] 
     set lst [lrange $lst $size end] 
    } 
    return $partitions 
} 

set list1 {1 2 3 4 5 6 7 8 9} 
lassign [partition $list1 3] listc1 listc2 listc3 

foreach var {listc1 listc2 listc3} {puts $var=[set $var]} 
listc1=1 2 3 
listc2=4 5 6 
listc3=7 8 9 

В Tcl 8.6, я хотел бы посмотреть в с помощью сопрограммы и выход следующего раздела. Ответ


Обобщая @ Костик в:

proc partition {list size} { 
    for {set i 0; set j [expr {$size - 1}]} {$i < [llength $list]} {incr i $size; incr j $size} { 
     lappend partitions [lrange $list $i $j] 
    } 
    return $partitions 
} 
5

Ваше первое заявление немного от: Tcl не использует запятые для разделения элементов списка, он использует пробелы. Ниже приведен фрагмент кода, который будет делать то, что вы хотите:

set list1 {1 2 3 4 5 6 7 8 9} 
set counter 0 
foreach {a b c} $list1 { 
    set listc[incr counter] [list $a $b $c] 
} 

Обсуждение

  • Оператор Еогеасп занимает 3 элемента из списка в то время. На первой итерации a = 1, b = 2, c = 3. Во втором - a = 4, b = 5, c = 6 и т. Д.
  • Выражение listc[incr counter] даст listc1, listc2 ...
  • Если длина Листа не делится на три, то последний listc* будет заполнен пустыми элементами.
+0

у нас есть какие-либо встроенные функции можно указать длину элементов хотели копировать? – user2131316

+0

@ user2131316, 'lrange' извлекает непрерывный подсписчик с учетом индексов его первого и последнего элементов в списке источников. Каждая из этих индексов заключена в другую (или любое произвольное целое число) с помощью команды 'expr'. Вы открыли [учебник] (http://www.tcl.tk/man/tcl8.5/tutorial/tcltutorial.html)? – kostix

+0

@ user2131316, см. Решение Гленна. –

1
set list1 {1 2 3 4 5 6 7 8 9} 
set listc1 [lrange $list1 0 2] 
set listc2 [lrange $list1 3 5] 
set listc3 [lrange $list1 6 9] 

С Tcl 8.4 последнее утверждение может быть записано в виде

set listc3 [lrange $list1 6 end] 
+0

Вы должны сначала удалить запятые в '$ list1' :) – Jerry

+0

Вы должны использовать' end' вместо 'end-1', и это тоже будет работать с 8.4. –

+0

@ Джерри, спасибо! Непосредственно скопировано и вклеено ;-) – kostix

Смежные вопросы