我想从Tcl中的列表中删除子列表。我知道如何使用lreplace
为主列表执行此操作,但我不知道如何为子列表执行此操作。
例如:
set a { 1 2 { {3 4} { 4 } } }
现在我要从内部列表{4}
中删除{ {3 4} {4} }
。
最终的清单应该是:
a { 1 2 { {3 4} } }
请建议如何点缀他的。
答案 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]
这是有效的,因为lset
和lindex
都可以采用路径,而且它们也可以使用空路径进行合理的处理。