5

ネストされたリストに要素を動的に追加したい。次の例を検討してください。

set super_list {}
lappend super_list {00 01 02}
lappend super_list {10 11 12}
lappend super_list {20 21}

結果:

super_list = {00 01 02} {10 11 12} {20 21}
[lindex $super_list 0] = {00 01 02}
[lindex $super_list 1] = {10 11 12}
[lindex $super_list 2] = {20 21}

[lindex $super_list 2] に別の値 (22 など) を追加するにはどうすればよいですか?

lappend [lindex $super_list 2] 22

動作しません!

これまでに考えられる唯一の回避策は次のとおりです。

lset super_list 2 [concat [lindex $super_list 2] {22}]

これが本当に唯一の方法ですか?

ありがとう、ライナス

4

2 に答える 2

4

Tcl 8.6 (機能が追加されました。以前のバージョンでは機能しません) ではlset、 index を介してネストされたリストを拡張するために使用できend+1ます。

set super_list {{00 01 02} {10 11 12} {20 21}}
lset super_list 2 end+1 22
puts [lindex $super_list 2]
# ==>  20 21 22

数値インデックスを使用して最後を過ぎたアドレスに対処することもできますが、end+1より記憶に残ると思います。

于 2013-07-30T14:46:37.740 に答える
2

リストがこれを行うための直接的な方法はありません。少なくとも proc でまとめることができます。

proc sub_lappend {listname idx args} {
    upvar 1 $listname l
    set subl [lindex $l $idx]
    lappend subl {*}$args
    lset l $idx $subl
}
sub_lappend super_list 2 22 23 24
{00 01 02} {10 11 12} {20 21 22 23 24}

このアプローチの利点は、インデックスのリストを渡して、任意にネストされたリスト (のようにlset)で機能できることです。

% sub_lappend super_list {0 0} 00a 00b 00c
{{00 00a 00b 00c} 01 02} {10 11 12} {20 21 22 23 24}
于 2013-07-30T14:19:08.130 に答える