Извлечь каждый n-й элемент из списка TCL

мы можем извлечь каждый n-й элемент списка TCL с помощью цикла foreach. Но существует ли однострочная общая команда TCL, которая поможет? Что-то вроде lindex с опцией '-stride'.


person Gert Gottschalk    schedule 26.01.2018    source источник


Ответы (2)


Если у вас lmap (версия Tcl 8.5 по ссылкам ниже), вы можете сделать это:

lmap [lrepeat $n a] $list {set a}

Пример:

set list {a b c d e f g h i j k l}
set n 2
lmap [lrepeat $n a] $list {set a}
# => b d f h j l

Но ваш комментарий, похоже, указывает на то, что вам действительно нужно значение n+1 th. В этом случае:

lmap [lreplace [lrepeat $n b] 0 0 a] $list {set a}
# => a c e g i k

Документация: список, lmap (для Tcl 8.5), lmap, lrepeat, lreplace, set

person Peter Lewerin    schedule 27.01.2018
comment
Дал этот «принятый ответ», поскольку он не включает процедуру или цикл и может быть задан как однострочный. - person Gert Gottschalk; 02.02.2018

Нет, но вы можете написать процедуру, например:

proc each_nth {list n} {
    set result [list]
    set varlist [lreplace [lrepeat $n -] end end nth]
    while {[llength $list] >= $n} {
        set list [lassign $list {*}$varlist]
        lappend result $nth
    }
    return $result
}

а потом:

each_nth {a b c d e f g h i j k l} 3    ;# => c f i l
each_nth {a b c d e f g h i j k l} 4    ;# => d h l
each_nth {a b c d e f g h i j k l} 5    ;# => e j
person glenn jackman    schedule 26.01.2018
comment
Мне нравится, что. Я бы не подумал использовать lassign таким образом. - person andy mango; 27.01.2018
comment
В моем конкретном случае n = 2, поэтому я придумал foreach {x y } $l {lappend z $x}. Но приветствуется более общий случай для n. - person Gert Gottschalk; 27.01.2018