如何根据TCL中列表中的值执行选择性删除?

如何根据TCL中列表中的值执行选择性删除?,tcl,Tcl,考虑到像{100 169 144 289}这样的列表,删除此处示例列表中的奇数正方形169289的最佳方法是什么?最简单的方法是过滤列表。根据条件的性质,对于可以表示为字符串模式的内容,主要技术是lsearch-all-inline(可能与-not),其余的则是lmap。在您的情况下,我们可以: set filtered [lmap x $input { if {$x & 1} then continue else {set x} }] 这里的技巧是lmap主体中的contin

考虑到像{100 169 144 289}这样的列表,删除此处示例列表中的奇数正方形169289的最佳方法是什么?

最简单的方法是过滤列表。根据条件的性质,对于可以表示为字符串模式的内容,主要技术是
lsearch-all-inline
(可能与
-not
),其余的则是
lmap
。在您的情况下,我们可以:

set filtered [lmap x $input {
    if {$x & 1} then continue else {set x}
}]

这里的技巧是
lmap
主体中的
continue
跳过将值添加到输出列表,而
set x
读取
x
的值。结果是跳过所有奇数(因为
$x&1
是一个表达式,当
x
包含奇数时为真),否则将添加到列表中。表达式可以任意复杂。(要覆盖,只需执行
设置输入[lmap…]
而不是
设置过滤[lmap…]
。测试时将它们分开。)

最简单的方法是过滤列表。根据条件的性质,对于可以表示为字符串模式的内容,主要技术是
lsearch-all-inline
(可能与
-not
),其余的则是
lmap
。在您的情况下,我们可以:

set filtered [lmap x $input {
    if {$x & 1} then continue else {set x}
}]
这里的技巧是
lmap
主体中的
continue
跳过将值添加到输出列表,而
set x
读取
x
的值。结果是跳过所有奇数(因为
$x&1
是一个表达式,当
x
包含奇数时为真),否则将添加到列表中。表达式可以任意复杂。(要覆盖,只需执行
set input[lmap…]
而不是
set filtered[lmap…]
。测试时将它们分开。)