いくつかのデータ (数値データまたは文字列) を含む 2 つのリストがありますか?
リストにサブリストが含まれていないと仮定して、これら 2 つのリストを結合するにはどうすればよいですか?
どちらの選択肢が好まれますか、またその理由は何ですか?
set first [concat $first $second]
lappend first $second
append first " $second"
いくつかのデータ (数値データまたは文字列) を含む 2 つのリストがありますか?
リストにサブリストが含まれていないと仮定して、これら 2 つのリストを結合するにはどうすればよいですか?
どちらの選択肢が好まれますか、またその理由は何ですか?
set first [concat $first $second]
lappend first $second
append first " $second"
使用concat
しても問題なく、場合によっては非常に効率的です (これは 8.4 以前では推奨される手法であり、それ以降のバージョンでもそれほど悪くはありません)。ただし、 の 2 番目のオプションlappend
はまったく機能せず、 のバージョンはappend
機能しますが、恐ろしく非効率的です。
動作する他のバージョン:
# Strongly recommended from 8.6.1 on
set first [list {*}$first {*}$second]
lappend first {*}$second
8.6.1 以降で最初の方法が推奨される理由は、コンパイラがそれを直接の「リスト連結」操作に最適化できるためです。
% 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}
ドキュメントを調べ、いくつかのリストを試してみたところ、次のことがわかりました。
concat
は正しいですlappend
$second
リストではなく1つの要素として扱うため、機能しませんappend
動作しますが、リストを文字列として扱っています。どういう意味かはわかりませんが、first
とsecond
がリストであるという意図を伝えていません。少し古いかもしれませんが、明確にしたかったのです。
すでに述べたように、2 つのリストをマージする標準的な方法はconcat
v8.6 より前のバージョンです。concat
ただし、マージの一部としてリストを分析するため、長いリストを扱う場合は非常に非効率になることに注意してください。たとえば、リストをマージする場合、リストが大きくなるほどマージが遅くなります。
どちらの追加も「リスト」をマージせず、既存のリスト ( lappend
) または変数 ( append
) に追加するだけです。どちらの追加も、追加時に何も分析しないため、速度には影響しません。
単一のエントリ リスト要素をマージするset first [join [lappend first $second]]
場合、各リスト内の単純な要素または単一の要素を処理する場合 (つまり、要素ごとにスペースがない場合) に限り、それらをマージできます。