在tcl中创建一个列表,其中的元素位于正确的索引位置

时间:2012-11-16 07:33:06

标签: list join split tcl concatenation

如何将以下字符串/列表转换为第一个元素为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} {}

由于

2 个答案:

答案 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)

您似乎希望实现两个目标:

  1. 从原始列表中删除所有空白项目
  2. 对于每个非空项目,删除空格
  3. 我想提供一种不同的方法:使用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。这个解决方案可能不是最有效的方法,但却是解决问题的另一种方法。