如何从Tcl列表中删除空元素

4

你好,我有以下列表:

%设置qprList {{{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} 12345 {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} 12345 {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} 12345   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} 12345 {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}}}

我想删除所有为空的元素。由于是列表的列表,我无法在单个循环迭代中完成。

有没有简单的方法来实现这个目标呢?


你关心列表结构中的任何部分吗?例如,你想要整个列表被展平吗?还是只需要那些叶子节点为空字符串的部分? - jk.
4个回答

3

该列表中没有空元素。 看起来为空的元素可以被视为(a)一个字符串“{}”或(b)一个只有一个元素的列表,该元素是空字符串或空列表。

package require struct::list
set non_empty [struct::list filter \
                 [struct::list flatten $qprList] \
                 {apply {{x} {expr {[string length $x] > 0}}}} \
              ]

3
你也可以尝试这个:
set listwithoutnulls [lsearch -all -inline -not -exact $listwithnulls {}]

它不需要包含任何软件包。同样,它也可以重新应用。

1

来自Tclers Wiki(http://wiki.tcl.tk/440):

将列表扁平化:

concat {*}$nested

可以多次应用:

proc flatten data { concat {*}$data }

set a {{a {b c}} {d {e f}}} ; # {a {b c}} {d {e f}} flatten $a ; # a {b c} d {e f} flatten [flatten $a] ; # a b c d e f


0

我也使用struct::list是因为我懒:

package require struct::list
set non_empty [struct::list flatten -full $qprList]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接