从tcl中的列表中删除子列表
我想从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
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}。我想他的问题是知道路径。。。因此,他需要循环他的列表,以查看列表/子列表中的哪个元素是单个值(他的条件)。