9

いくつかのデータ (数値データまたは文字列) を含む 2 つのリストがありますか?

リストにサブリストが含まれていないと仮定して、これら 2 つのリストを結合するにはどうすればよいですか?

どちらの選択肢が好まれますか、またその理由は何ですか?

  1. set first [concat $first $second]

  2. lappend first $second

  3. append first " $second"

4

3 に答える 3

17

使用concatしても問題なく、場合によっては非常に効率的です (これは 8.4 以前では推奨される手法であり、それ以降のバージョンでもそれほど悪くはありません)。ただし、 の 2 番目のオプションlappendはまったく機能せず、 のバージョンはappend機能しますが、恐ろしく非効率的です。

動作する他のバージョン:

# Strongly recommended from 8.6.1 on
set first [list {*}$first {*}$second]
lappend first {*}$second

8.6.1 以降で最初の方法が推奨される理由は、コンパイラがそれを直接の「リスト連結」操作に最適化できるためです。

于 2013-07-14T05:57:12.373 に答える
3

% set first {a b c}
a b c
% set second {1 2 3}
1 2 3
% set first [concat $first $second]; # #1 is correct
a b c 1 2 3
% set first {a b c}
a b c
% lappend first $second; # #2 is wrong: appends the whole `second` list to `first
a b c {1 2 3}

討論

ドキュメントを調べ、いくつかのリストを試してみたところ、次のことがわかりました。

  1. あなたの最初の選択concatは正しいです
  2. lappend$secondリストではなく1つの要素として扱うため、機能しません
  3. append動作しますが、リストを文字列として扱っています。どういう意味かはわかりませんが、firstsecondがリストであるという意図を伝えていません。
于 2013-07-13T22:19:45.857 に答える
1

少し古いかもしれませんが、明確にしたかったのです。

すでに述べたように、2 つのリストをマージする標準的な方法はconcatv8.6 より前のバージョンです。concatただし、マージの一部としてリストを分析するため、長いリストを扱う場合は非常に非効率になることに注意してください。たとえば、リストをマージする場合、リストが大きくなるほどマージが遅くなります。

どちらの追加も「リスト」をマージせず、既存のリスト ( lappend) または変数 ( append) に追加するだけです。どちらの追加も、追加時に何も分析しないため、速度には影響しません。

単一のエントリ リスト要素をマージするset first [join [lappend first $second]]場合、各リスト内の単純な要素または単一の要素を処理する場合 (つまり、要素ごとにスペースがない場合) に限り、それらをマージできます。

于 2016-06-10T18:31:10.587 に答える