将tcl列表连接到一个列表中

时间:2013-10-02 20:03:09

标签: list tcl

我有一个返回单个元素或元素列表的过程。我试图将所有返回的元素连接到一个列表中。

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}

但我希望连接childListtempChildList,以便我的最终结果将是

{a b c d e f g h i j}

我正在考虑使用concat命令,但问题是它不会在我上面的用例中连接像{g {j i}}这样的嵌套列表。

6 个答案:

答案 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,直到lstnewlst相等 - 这就是我们知道我们已完全展平列表的时间。

答案 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