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

从tcl中的列表中删除子列表,tcl,Tcl,我想从Tcl中的列表中删除一个子列表。我知道如何使用lreplace为主列表执行此操作,但我不知道如何为子列表执行此操作。 例如: set a { 1 2 { {3 4} { 4 } } } 现在我想从内部列表中删除{3 4}{4}。 最后名单应为: a { 1 2 { {3 4} } } a{1 2{{3 4}}} 请建议如何给他打点 组合lindex以获取内部子列表,lreplace删除提取的内部子列表的元素,lset将修改后的子列表放回原位 但老实说,我觉得你的数据模型有问题 pro

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

set a { 1 2  { {3 4} { 4 } } }
现在我想从内部列表中删除
{3 4}{4}
。 最后名单应为:

a { 1 2 { {3 4} } } a{1 2{{3 4}}}
请建议如何给他打点

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

但老实说,我觉得你的数据模型有问题

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中显示。

需要一些技巧才能很好地完成:

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]

这是因为
lset
lindex
都可以使用路径,并且它们也可以使用空路径执行明智的操作。

我们缺少的是选择要删除的元素所需的标准,即它始终是第三个子列表中的第二个子列表还是其他什么?也不是lreplace实际创建了一个新列表,它不执行就地替换。条件是,如果列表{3 4}{4}的内部子列表中的元素少于两个,请将其删除。就像在{34}中,我们有元素,但在{4}中只有一个元素,所以我需要删除{4}。我想他的问题是知道路径。。。因此,他需要循环他的列表,以查看列表/子列表中的哪个元素是单个值(他的条件)。