从tcl中的列表中删除子列表

时间:2011-10-10 10:53:25

标签: tcl

我想从Tcl中的列表中删除子列表。我知道如何使用lreplace为主列表执行此操作,但我不知道如何为子列表执行此操作。 例如:

set a { 1 2  { {3 4} { 4 } } }

现在我要从内部列表{4}中删除{ {3 4} {4} }。 最终的清单应该是:

a { 1 2  { {3 4} } }

请建议如何点缀他的。

3 个答案:

答案 0 :(得分:2)

合并lindex以获取内部子列表,lreplace删除提取的内部子列表中的元素,并lset将修改后的子列表重新放回原位。

但老实说,我觉得你的数据模型有些不对劲。

答案 1 :(得分:1)

proc retlist {a} {
    set nl ""
    foreach i $a {
        if {[llength $i] > 1} {
            set nl2 ""
            foreach i2 $i {
                if {[llength $i2] > 1} { lappend nl2 $i2 }
            }
            lappend nl $nl2
        } else {
            lappend nl $i
        }
    }
    return $nl
}

如果您需要可变深度,则此代码会丢失。你需要递归。

% set a {1 2 {{3 4} {5}}}
1 2 {{3 4} {5}}
% retlist $a
1 2 {{3 4}}

由于外部列表永远不会显示在tclsh。

答案 2 :(得分:1)

这需要一些技巧才能做得很好:

proc lremove {theList args} {
    # Special case for no arguments
    if {[llength $args] == 0} {
        return {}
    }
    # General case
    set path [lrange $args 0 end-1]
    set idx [lindex $args end]
    lset theList $path [lreplace [lindex $theList $path] $idx $idx]
}

set a [lremove $a 2 1]

这是有效的,因为lsetlindex都可以采用路径,而且它们也可以使用空路径进行合理的处理。