如何根据TCL中列表中的值执行选择性删除?
考虑到像{100 169 144 289}这样的列表,删除此处示例列表中的奇数正方形169289的最佳方法是什么?最简单的方法是过滤列表。根据条件的性质,对于可以表示为字符串模式的内容,主要技术是如何根据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
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…]
。测试时将它们分开。)