мы можем извлечь каждый n-й элемент списка TCL с помощью цикла foreach. Но существует ли однострочная общая команда TCL, которая поможет? Что-то вроде lindex с опцией '-stride'.
Извлечь каждый n-й элемент из списка TCL
Ответы (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
Дал этот «принятый ответ», поскольку он не включает процедуру или цикл и может быть задан как однострочный.
- 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
Мне нравится, что. Я бы не подумал использовать lassign таким образом.
- person andy mango; 27.01.2018
В моем конкретном случае n = 2, поэтому я придумал foreach {x y } $l {lappend z $x}. Но приветствуется более общий случай для n.
- person Gert Gottschalk; 27.01.2018