如何将以下字符串/列表转换为第一个元素为1-81秒元素的列表为81-162第三个元素我们162-243使用tcl
{} {} {1 -81} {} {81 -162} {} {162 -243} {} {243 -324} {} {324 -405} {} {405 -486} {} { 486 -567} {} {567 -648} {} {648 -729} {} {729 -810} {} {810 -891} {} {891 -972} {} {972 -1053} {} {1053 -1134} {}
由于
答案 0 :(得分:2)
如果您只想过滤掉空列表元素,那么显而易见的事情是:
# Assuming the original list is in $list
set result {}
foreach x $list {
if {[string trim $x] != ""} {
lappend result $x
}
}
# The result list should contain the cleaned up list.
请注意,如果您确定所有空元素都为空并且不包含空格(意味着[string trim]
而不是{}
},则无需执行{ }
)。但是您的示例包含空元素和空格,因此您需要执行字符串修剪。
或者,您可以使用正则表达式来测试:
foreach x $list {
# Test if $x contains non-whitespace characters:
if {[regexp {\S} $x]} {
lappend result $x
}
}
但是,您可以使用lsearch在一行中完成上述操作:
# Find all elements that contain non whitespace characters:
set result [lsearch -inline -all -regexp $list {\S}]
答案 1 :(得分:0)
您似乎希望实现两个目标:
我想提供一种不同的方法:使用struct :: list,它有一个过滤命令:
package require struct::list
set oldList {{} {} {1 -81} { } {81 -162} { } {162 -243} { } {243 -324} {}}
set newList [struct::list filterfor item $oldList {
[set item [string map {{ } {}} $item]] != ""
}]
在此解决方案中,我使用struct::list filterfor
命令,该命令类似于foreach命令。 filterfor的主体是布尔表达式。在正文中,我使用字符串映射来删除每个项目中的所有空格,并且只有在结果不为空时才返回true。这个解决方案可能不是最有效的方法,但却是解决问题的另一种方法。