0

単一の要素または要素のリストを返すプロシージャがあります。返されたすべての要素を単一のリストに連結しようとしています。

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 $tempChildListchildListそれに入ると、以下のようなリストのリストが形成されます

{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}}

4

6 に答える 6

3

モジュールをインポートできる場合は、次の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
于 2013-10-03T05:46:44.967 に答える
2

あなたの状況では、リストを平坦化するのではなく、作成中にもっと注意することをお勧めします。特に、フラット化には、リストに複合語が含まれている場合に問題があります (派手なデモなどを行うと、ひどくうまくいかない可能性があります)。より慎重に、どのような結果が得られているかを知っていれば::myproc(そしてそれが単純なリストであると仮定して)、単純な連結リストを非常に簡単に作成できます。

set childList [list]
foreach item $myList {
    lappend childList $item {*}[::myproc $item]
}

::myprocから単一のアイテムを返すことに熱心な場合は、次のように返すことに注意してください。

return [list $theItem]

if$theItemは単純な単語 (たとえば、ある種の ID) ですが、注意しなくても問題を解決できます。

于 2013-10-03T08:21:14.673 に答える
2

ここにうまくいくかもしれないものがあります:

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

newlst手順 2 で を設定すると、結果はほぼ希望どおりになることに注意してください。lstここで、とが等しくなるまでステップ 2 を繰り返します。これでnewlst、リストが完全に平坦化されたことがわかります。

于 2013-10-03T00:33:30.593 に答える
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

お役に立てれば。

于 2013-10-03T05:28:15.013 に答える
0

を与える代わりにlappend childList $tempChildList、使用できます

set childlist "$childlist $tempChildList"

if {[llength $tempChildList] > 0} {
   set childlist "$childlist $tempChildList"
}
于 2013-10-03T09:57:45.043 に答える