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

时间:2011-03-10 11:57:35

标签: list null tcl

喜 我有以下列表

  

%set qprList {{{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} 12345 {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} 12345 {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} 12345   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}} {{}} {{}} 12345 {{}} {{}}   {{}} {{}} {{}} {{}} {{}} {{}} {{}}   {{}} {{}}}

我想删除所有空的元素。因为列表的列表是我无法在单循环交互中进行。

实现这一目标的任何简单方法?

4 个答案:

答案 0 :(得分:3)

该列表中没有空元素。似乎为空的那些可以被视为(a)字符串“{}”或(b)具有一个元素的列表,该元素是空字符串或空列表。

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

答案 1 :(得分:2)

你也可以试试这个:

set listwithoutnulls [lsearch -all -inline -not -exact $listwithnulls {}]

它不需要包含。它也可以重新应用。

答案 2 :(得分: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

答案 3 :(得分:0)

我也使用struct :: list,因为我很懒:

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