我有一个返回单个元素或元素列表的过程。我试图将所有返回的元素连接到一个列表中。
set childList [list];
foreach item $myList {
lappend childList $item;
set tempChildList [::myproc $item]; #for different items it will return either single element or a list of elements.
if {[llength $tempChildList] > 0} {
lappend childList $tempChildList;
}
}
所以现在我在lappend
$tempChildList
进入childList
的最后一次发言中形成了如下列表的列表
{a {b c} {d e f} {g {h i}} j}
但我希望连接childList
和tempChildList
,以便我的最终结果将是
{a b c d e f g h i j}
我正在考虑使用concat
命令,但问题是它不会在我上面的用例中连接像{g {j i}}
这样的嵌套列表。
答案 0 :(得分:2)
如果您可以导入struct::list
模块,则可以执行以下操作:
% package require struct::list
1.8.1
% set oldlist {a {b c} {d e f} {g {h i}} j}
% set newlist [::struct::list flatten -full $oldlist]
a b c d e f g h i j
答案 1 :(得分:2)
在您的情况下,我建议不要压扁列表,而是在构建过程中更加小心。特别是,扁平化存在问题,其中列表包含复合词(当你进行花哨的演示时可能会导致严重错误,以及类似的事情)。通过更加小心,知道从::myproc
得到什么样的结果(并假设这是一个简单的列表),您可以很容易地生成一个简单的连接列表:
set childList [list]
foreach item $myList {
lappend childList $item {*}[::myproc $item]
}
请注意,如果您热衷于从::myproc
返回单个项目,请将其返回:
return [list $theItem]
虽然如果$theItem
是一个简单的单词(例如,某种ID),您可以在不小心的情况下离开。
答案 2 :(得分:1)
试试这个:
% set list {a {b c} {d e f} {g {h i}} j}
{a {b c} {d e f} {g {h i}} j}
% set newlist [regsub -all "\{|\}" $list ""]
a b c d e f g h i j
希望这有帮助。
答案 3 :(得分:0)
这可能有用:
proc flatten {lst} {
while 1 {
set newlst [concat {*}$lst]
if {$newlst == $lst} { break }
set lst $newlst
}
return $newlst
}
set lst {a {b c} {{{1 2} 3} 4} {d e f} {g {h i}} j}
puts [flatten $lst]
输出:
a b c 1 2 3 4 d e f g h i j
查看以下互动环节:
(1) % set lst {a {b c} {d e f} {g {h i}} j}
a {b c} {d e f} {g {h i}} j
(2) % set newlst [concat {*}$lst]
a b c d e f g {h i} j
请注意,当我们在步骤2中设置newlst
时,结果几乎就是我们想要的。现在,只需重复步骤2,直到lst
和newlst
相等 - 这就是我们知道我们已完全展平列表的时间。
答案 4 :(得分:0)
您可以使用
代替lappend childList $tempChildList
set childlist "$childlist $tempChildList"
if {[llength $tempChildList] > 0} {
set childlist "$childlist $tempChildList"
}
答案 5 :(得分:0)
尝试:
% set str {a {b c} {d e f} {g {h i}} j}
% while {1} {if [regexp -- {\\{} $str] {set str [join $str]} else {break}}
% set str
% a b c d e f g h i j