## Tcl9.0.3/Tk9.0.3 Documentation > Tcl Commands > dict

### Tcl/Tk Applications | Tcl Commands | Tk Commands | [incr Tcl] Package Commands | SQLite3 Package Commands | TDBC Package Commands | tdbc::mysql Package Commands | tdbc::odbc Package Commands | tdbc::postgres Package Commands | tdbc::sqlite3 Package Commands | Thread Package Commands | Tcl C API | Tk C API | [incr Tcl] Package C API | TDBC Package C API

  NAME
    dict — 辞書を取扱う Manipulate dictionaries
  構文 SYNOPSIS
  説明 DESCRIPTION
    dict append dictionaryVariable key ?string ...?
    dict create ?key value ...?
    dict exists dictionaryValue key ?key ...?
    dict filter dictionaryValue filterType arg ?arg ...?
      dict filter dictionaryValue key ?globPattern ...?
      dict filter dictionaryValue script {keyVariable valueVariable} script
      dict filter dictionaryValue value ?globPattern ...?
    dict for {keyVariable valueVariable} dictionaryValue body
    dict get dictionaryValue ?key ...?
    dict getdef dictionaryValue ?key ...? key default
    dict getwithdefault dictionaryValue ?key ...? key default
    dict incr dictionaryVariable key ?increment?
    dict info dictionaryValue
    dict keys dictionaryValue ?globPattern?
    dict lappend dictionaryVariable key ?value ...?
    dict map {keyVariable valueVariable} dictionaryValue body
    dict merge ?dictionaryValue ...?
    dict remove dictionaryValue ?key ...?
    dict replace dictionaryValue ?key value ...?
    dict set dictionaryVariable key ?key ...? value
    dict size dictionaryValue
    dict unset dictionaryVariable key ?key ...?
    dict update dictionaryVariable key varName ?key varName ...? body
    dict values dictionaryValue ?globPattern?
    dict with dictionaryVariable ?key ...? body
  DICTIONARY VALUES
  実施例 EXAMPLES
  関連情報 SEE ALSO
  KEYWORDS

### NAME

dict — 辞書を取扱う Manipulate dictionaries

### 構文 SYNOPSIS

dict option arg ?arg ...?

### 説明 DESCRIPTION

指定項目に従って辞書の値又は､辞書の値が入った変数(この記述についてはこの後の DICTIONARY VALUES 節を参照)に関する種々の操作の内の一つを行う｡公式の指示項目は以下の通り(略号が可能なものもある) : 　　　 Performs one of several operations on dictionary values or variables containing dictionary values (see the DICTIONARY VALUES section below for a description), depending on option. The legal options (which may be abbreviated) are:

dict append dictionaryVariable key ?string ...?
  与えられた変数内に含まれる辞書の値の内の､与えられた鍵に対応する値に､与えられた文字列(複数個も可能)を追記する､出来上がった辞書の値を元の変数に書込む｡実在しない鍵は空文字列に対応するとして扱われる｡更新された辞書が返される｡ もし､dictionaryVariable が無為設定の値が設定されいる配列に存在しない要素を指し示す場合､追記操作に先立つ辞書の値が無為設定の値として使われる｡(訳註 value and will be->value will be) 　　 This appends the given string (or strings) to the value that the given key maps to in the dictionary value contained in the given variable, writing the resulting dictionary value back to that variable. Non-existent keys are treated as if they map to an empty string. The updated dictionary value is returned. If dictionaryVariable indicates an element that does not exist of an array that has a default value set, the default value and will be used as the value of the dictionary prior to the appending operation.

dict create ?key value ...?
  引数として並べたそれぞれの 鍵/値 の対応(それぞれの鍵の後ろに対応する値を添えて､鍵と値を交互に並べる)を有する辞書を返す｡ 　　 Return a new dictionary that contains each of the key/value mappings listed as arguments (keys and values alternating, with each key being followed by its associated value.)

dict exists dictionaryValue key ?key ...?
  与えられた鍵(又は､入れ子になっている辞書では鍵の並び)が与えられた辞書の値の中に実在するか否かを表す論理値を返す｡この命令が真値を返す対象では､ dict get は捜索失敗しない｡ 　 This returns a boolean value indicating whether the given key (or path of keys through a set of nested dictionaries) exists in the given dictionary value. This returns a true value exactly when dict get on that path will succeed.

dict filter dictionaryValue filterType arg ?arg ...?
  辞書値から､指定された櫛型(略号があるものもある)に適合する 鍵/値 対を含んでいる新しい辞書を返す｡運営されている櫛型は以下の通り: 　　 This takes a dictionary value and returns a new dictionary that contains just those key/value pairs that match the specified filter type (which may be abbreviated.) Supported filter types are:

  dict filter dictionaryValue key ?globPattern ...?
    このkeyの規定は､与えられた鍵/値対 の鍵は与えられたどのような(string match と同じ形式の)文様にも合致するか､に適合することだけである｡　 The key rule only matches those key/value pairs whose keys match any of the given patterns (in the style of string match.)

  dict filter dictionaryValue script {keyVariable valueVariable} script
    記述譜規則は､鍵を鍵変数keyVariableに､変数を変数値valueVariableに代入し､次に､(真値が返される時､dict filter の結果の中に含まれる 鍵/語対 のみを伴う)論理値になる筈の与えられた記述譜を評価して､合致に関して試験する｡ 註意 規則を選定する語の後の最初の引数は２つの要素のリストである｡この記述譜 が､TCL_BREAK の状態と共に返ってきた時は､その後の鍵/語対は､結果となる辞書中には含まれなくなる､又 TCL_CONTINUE は偽値と等価である｡この鍵/語対は鍵を辞書に挿入した順序で検査される｡ The script rule tests for matching by assigning the key to the keyVariable and the value to the valueVariable, and then evaluating the given script which should result in a boolean value (with the key/value pair only being included in the result of the dict filter when a true value is returned.) Note that the first argument after the rule selection word is a two-element list. If the script returns with a condition of TCL_BREAK, no further key/value pairs are considered for inclusion in the resulting dictionary, and a condition of TCL_CONTINUE is equivalent to a false result. The key/value pairs are tested in the order in which the keys were inserted into the dictionary.

  dict filter dictionaryValue value ?globPattern ...?
    この value の規定は､その 鍵/値対 の値は､与えられたどのような(string match と同じ形式の)紋様にも合致するか､に適合することだけである｡ The value rule only matches those key/value pairs whose values match any of the given patterns (in the style of string match.)

dict for {keyVariable valueVariable} dictionaryValue body
  この命令は三つの引数をとる､第１は､２つの要素の変数名リスト(辞書中の鍵とその値にそれぞれ対応する)､第２は､繰り返すべき辞書値､第３は､それぞれの鍵と適切に設定された値の変数のそれぞれの対応について､評価すべき( foreach と同じ方法で)記述譜である｡この命令の結果は空文字列である｡もし､記述譜のどれかの評価結果に TCL_BREAK ができると､それ以上の辞書の鍵/語対は調査されず､この dict for 命令は成功裡にすぐさま終了する｡もし記述譜のどれかの評価結果が TCL_CONTINUE になると､正常な TCL_OK と同じ扱いを受ける｡繰り返す順序は辞書に挿入された鍵の順になる｡ 　　　 This command takes three arguments, the first a two-element list of variable names (for the key and value respectively of each mapping in the dictionary), the second the dictionary value to iterate across, and the third a script to be evaluated for each mapping with the key and value variables set appropriately (in the manner of foreach.) The result of the command is an empty string. If any evaluation of the body generates a TCL_BREAK result, no further pairs from the dictionary will be iterated over and the dict for command will terminate successfully immediately. If any evaluation of the body generates a TCL_CONTINUE result, this shall be treated exactly like a normal TCL_OK result. The order of iteration is the order in which the keys were inserted into the dictionary.

dict get dictionaryValue ?key ...?
  辞書値(第１引数)と､鍵(第２引数)とが与えられ､その鍵に対応する値を戻してくる｡複数の鍵が与えられると､この命令は､ dict get $dictVal $key の結果を第１引数､残りの引数を第２引数(及びその次の引数)として dict get に手渡す様に振舞う｡これにより､入れ子の構造の辞書を捜せる様になっている｡譬えば次の二つの命令は等価である: Given a dictionary value (first argument) and a key (second argument), this will retrieve the value for that key. Where several keys are supplied, the behaviour of the command shall be as if the result of dict get $dictVal $key was passed as the first argument to dict get with the remaining arguments as second (and possibly subsequent) arguments. This facilitates lookups in nested dictionaries. For example, the following two commands are equivalent:

      dict get $dict foo bar spong
      dict get [dict get [dict get $dict foo] bar] spong

  鍵が与えられない時は､ dict get は､要素の対を含むリストを array get と似た方法で戻してくる｡即ち､各対の第１要素が鍵で第２要素がその鍵の値になる｡ 　　 If no keys are provided, dict get will return a list containing pairs of elements in a manner similar to array get. That is, the first element of each pair would be the key and the second element would be the value for that key.

  辞書に存在しない鍵に対応する値を取得しようとすると不都合になる｡ It is an error to attempt to retrieve a value for a key that is not present in the dictionary.

dict getdef dictionaryValue ?key ...? key default

dict getwithdefault dictionaryValue ?key ...? key default
  これは dict get と同様に振舞って(少なくとも一つの鍵語の引数を伴って)､鍵語経路が辞書 dictionaryValue 内に対応付けしている値を返すが､但し､鍵語(若しくは鍵語経路上の一つの鍵語)がない場合には､その理由で不都合を返す代りに､無為設定の引数を返す｡ This behaves the same as dict get (with at least one key argument), returning the value that the key path maps to in the dictionary dictionaryValue, except that instead of producing an error because the key (or one of the keys on the key path) is absent, it returns the default argument instead.

  註意すべきは､常に最低一つの鍵語が与えれなくてはならない､又､ dict getdef と dict getwithdefault は相互に別名である｡ Note that there must always be at least one key provided, and that dict getdef and dict getwithdefault are aliases for each other.

dict incr dictionaryVariable key ?increment?
  与えられた変数に含まれる辞書値中の､与えられた鍵に対応する値を､与えられた増分値(整数 省略すると 1 を指定したと看做す)だけ増量し､出来上がった辞書の値を元の変数に書込む｡実在しない鍵は､0 に対応している様に扱う｡既存の鍵についての増量値が整数でない場合は不具合になる｡更新された辞書値が返される｡ もし､dictionaryVariable が無為設定の値が設定されいる配列に存在しない要素を指し示す場合､追記操作に先立つ辞書の値が無為設定の値として使われる｡(訳註 value and will be->value will be) 　 This adds the given increment value (an integer that defaults to 1 if not specified) to the value that the given key maps to in the dictionary value contained in the given variable, writing the resulting dictionary value back to that variable. Non-existent keys are treated as if they map to 0. It is an error to increment a value for an existing key if that value is not an integer. The updated dictionary value is returned. If dictionaryVariable indicates an element that does not exist of an array that has a default value set, the default value and will be used as the value of the dictionary prior to the incrementing operation.

dict info dictionaryValue
  与えられた辞書の情報を(可読性を意図して)戻してくる､但し､このデータの書式は辞書の実装に依存する｡辞書は連想配列により実現されているので､辞書は､ Tcl_HashStats によって作成された文字列を､ array statistics と似た方法で返すと期待されている｡ 　 This returns information (intended for display to people) about the given dictionary though the format of this data is dependent on the implementation of the dictionary. For dictionaries that are implemented by hash tables, it is expected that this will return the string produced by Tcl_HashStats, similar to array statistics.

dict keys dictionaryValue ?globPattern?
  指定した辞書の全ての鍵をリストにして返す｡もし､紋様をも指定すると､それに合致する(string match の方式に従う)鍵のみ選択して返す｡返される鍵は､その鍵がその辞書に挿入された順に並ぶ｡ Return a list of all keys in the given dictionary value. If a pattern is supplied, only those keys that match it (according to the rules of string match) will be returned. The returned keys will be in the order that they were inserted into the dictionary.

dict lappend dictionaryVariable key ?value ...?
  与えられた変数に入っている辞書値の､与えられた鍵に対応するリスト値に､与えられた項目を追記して､出来上がった辞書を元の変数に書き戻す｡実在しない鍵は､恰も空文字列に対応するかの様に扱われ､又､リストに追記する項目がなくても不具合にならない｡しかし､鍵に対応する様に与えた値がリストとして表現されないときは不具合になる｡更新された辞書が返される｡ もし､dictionaryVariable が無為設定の値が設定されいる配列に存在しない要素を指し示す場合､追記操作に先立つ辞書の値が無為設定の値として使われる｡ to in the dictionary value contained in the given variable, writing the resulting dictionary value back to that variable. Non-existent keys are treated as if they map to an empty list, and it is legal for there to be no items to append to the list. It is an error for the value that the key maps to to not be representable as a list. The updated dictionary value is returned. If dictionaryVariable indicates an element that does not exist of an array that has a default value set, the default value and will be used as the value of the dictionary prior to the list-appending operation.

dict map {keyVariable valueVariable} dictionaryValue body
  この命令は辞書のそれぞれの要素に変換を適用し新しい辞書を返す｡これは三つの引数をとる: 第１は変数名の二要素のリスト(その辞書内で組合されている鍵と値にそれぞれ対応する)､第２､繰り返される辞書の値､第３､それぞれの適切に設定された鍵と値の変数の対応について評価すべき記述譜( lmap 命令の方法で)｡評価された記述譜が通常に完了した( error の正反対としての TCL_OK 等)捜索内で､記述譜の結果は､その時点での keyVariable 変数の現在の内容の鍵を使って､累積辞書に入れられる｡ dict map 命令の結果は全ての鍵が捜索された後の累積辞書である｡ 　　 This command applies a transformation to each element of a dictionary, returning a new dictionary. It takes three arguments: the first is a two-element list of variable names (for the key and value respectively of each mapping in the dictionary), the second the dictionary value to iterate across, and the third a script to be evaluated for each mapping with the key and value variables set appropriately (in the manner of lmap). In an iteration where the evaluated script completes normally (TCL_OK, as opposed to an error, etc.) the result of the script is put into an accumulator dictionary using the key that is the current contents of the keyVariable variable at that point. The result of the dict map command is the accumulator dictionary after all keys have been iterated over.

  もし特定の段階の記述譜の評価が break を発生した場合､辞書からそれ以上の対は捜索されず､ dict map 命令 は直ちに成功裡に終了する｡もし特定の段階の記述譜の評価が continue の結果を発生した場合､現在の捜索は中断され累積辞書は修正されない｡捜索の順序は辞書の自然の順(典型的には鍵が辞書に追加された順序; その順序は dict for に使われる順序と同じ)である｡ If the evaluation of the body for any particular step generates a break, no further pairs from the dictionary will be iterated over and the dict map command will terminate successfully immediately. If the evaluation of the body for a particular step generates a continue result, the current iteration is aborted and the accumulator dictionary is not modified. The order of iteration is the natural order of the dictionary (typically the order in which the keys were added to the dictionary; the order is the same as that used in dict for).

dict merge ?dictionaryValue ...?
  それぞれの dictionaryValue 引数の内容を含む辞書を返す｡ここで､二つの(或はそれ以上の)辞書が同じ鍵の為の対応を含む場合は､出来上がる辞書は､その鍵の為の対応を含む命令行内の最後の辞書に従って鍵を値に対応する｡　　 Return a dictionary that contains the contents of each of the dictionaryValue arguments. Where two (or more) dictionaries contain a mapping for the same key, the resulting dictionary maps that key to the value according to the last dictionary on the command line containing a mapping for that key.

dict remove dictionaryValue ?key ...?
  第１引数として与えた古い辞書から､列挙したそれぞれの鍵の対応を除いて複写した新しい辞書を返す｡削除すべき鍵が無くてもよく､第１引数として与えた辞書に､削除を指定したどの鍵が存在しなくても構わない｡ 　　 Return a new dictionary that is a copy of an old one passed in as first argument except without mappings for each of the keys listed. It is legal for there to be no keys to remove, and it also legal for any of the keys to be removed to not be present in the input dictionary in the first place.

dict replace dictionaryValue ?key value ...?
  第１引数として与えた古い辞書から､幾つかの値を変更したり､幾つかの余分の 鍵/語 対を追加して複写した新辞書を返す｡この命令では､鍵/語 対 無しで呼出しても構わないが､この命令では値を伴わない鍵の指定はできない｡ 　 Return a new dictionary that is a copy of an old one passed in as first argument except with some values different or some extra key/value pairs added. It is legal for this command to be called with no key/value pairs, but illegal for this command to be called with a key but no value.

dict set dictionaryVariable key ?key ...? value
  この操作では､辞書値を含む変数の名前を引数にとり､与えられた鍵から与えられた値への対応も内在するように更新された辞書値を元の変数に置いてくる｡複数の鍵を与えると､入れ子になった辞書を作成又は更新する｡更新された辞書の値が返される｡ もし､dictionaryVariable が無為設定の値が設定されいる配列に存在しない要素を指し示す場合､挿入/更新 操作に先立つ辞書の値が無為設定の値として使われる｡(訳註 value and will be->value will be) 　 This operation takes the name of a variable containing a dictionary value and places an updated dictionary value in that variable containing a mapping from the given key to the given value. When multiple keys are present, this operation creates or updates a chain of nested dictionaries. The updated dictionary value is returned. If dictionaryVariable indicates an element that does not exist of an array that has a default value set, the default value and will be used as the value of the dictionary prior to the value insert/update operation.

dict size dictionaryValue
  与えられた辞書値の中の 鍵/値 対応の個数を返す｡ Return the number of key/value mappings in the given dictionary value.

dict unset dictionaryVariable key ?key ...?
  この操作(dict set の相棒)は､辞書値を含む変数の名前を引数にとり､与えられた鍵に対応する値が無くなる様に更新された辞書値を元の変数に置いてくる｡複数の鍵を与えると､それは､削除すべき対応への入れ子になった辞書の経路を記述している｡鍵は､少なくとも１つは必要であり､入れ子の辞書の筋道では､最後の鍵だけは無くてもよく､その途中の全ての構成物は必要である｡更新された辞書の値が返される｡ もし､dictionaryVariable が無為設定の値が設定されいる配列に存在しない要素を指し示す場合､値削除操作に先立つ辞書の値が無為設定の値として使われる｡ This operation (the companion to dict set) takes the name of a variable containing a dictionary value and places an updated dictionary value in that variable that does not contain a mapping for the given key. Where multiple keys are present, this describes a path through nested dictionaries to the mapping to remove. At least one key must be specified, but the last key on the key-path need not exist. All other components on the path must exist. The updated dictionary value is returned. If dictionaryVariable indicates an element that does not exist of an array that has a default value set, the default value and will be used as the value of the dictionary prior to the value remove operation.

dict update dictionaryVariable key varName ?key varName ...? body
  変数 varName に対応したそれぞれの 鍵 の為の値(dictionaryVariable 中の辞書値を読むと現れる様な)を使い､ body の中のTcl 記述譜を実行する｡複数の 鍵/varName 対があってもよい｡鍵に対応がついてない場合は varName 削除 に相当する｡ body が終了した時､ varName になされた全ての変化は dictionaryVariable 中の辞書に反映される､縦え body が不具合やその他の例外的な終了になっても行われる(但し､全ての更新が警告なしに破棄された時に､ dictionaryVariable 変数 そのものが読出せなくなった場合を除く)｡ dict update の戻り値は(何かの不具合が起こらない限り) body の評価値である｡ もし､dictionaryVariable が無為設定の値が設定されいる配列に存在しない要素を指し示す場合､更新操作に先立つ辞書の値が無為設定の値として使われる｡ 　　 Execute the Tcl script in body with the value for each key (as found by reading the dictionary value in dictionaryVariable) mapped to the variable varName. There may be multiple key/varName pairs. If a key does not have a mapping, that corresponds to an unset varName. When body terminates, any changes made to the varNames is reflected back to the dictionary within dictionaryVariable (unless dictionaryVariable itself becomes unreadable, when all updates are silently discarded), even if the result of body is an error or some other kind of exceptional exit. The result of dict update is (unless some kind of error occurs) the result of the evaluation of body. If dictionaryVariable indicates an element that does not exist of an array that has a default value set, the default value and will be used as the value of the dictionary prior to the update operation.

  各 varName は dict update を包み込む有効範囲の中で対応付けされる; この命令は局所的有効範囲(手続函数 か､apply のλ項 か､手段)の中でのみ使用することを推奨する｡理由は､ dict update によって設定された変数は命令が終わった後も(明示的に 削除する迄)存続し続ける為｡ 　 Each varName is mapped in the scope enclosing the dict update; it is recommended that this command only be used in a local scope (procedure, lambda term for apply, or method). Because of this, the variables set by dict update will continue to exist after the command finishes (unless explicitly unset).

  註意 値から変数への対応は traces を使用しない; dictionaryVariable の内容への変更は､ body が終了した時にのみ生じる｡ Note that the mapping of values to variables does not use traces; changes to the dictionaryVariable's contents only happen when body terminates.

dict values dictionaryValue ?globPattern?
  与えられた辞書内の全ての値のリストを返す｡もし､紋様をも指定すると､それに適合する(string match の規則に従う)値のみを返す｡返ってくる値の順序は､その値に関連する鍵をその辞書に挿入された順に並ぶ｡ 　　　 Return a list of all values in the given dictionary value. If a pattern is supplied, only those values that match it (according to the rules of string match) will be returned. The returned values will be in the order of that the keys associated with those values were inserted into the dictionary.

dict with dictionaryVariable ?key ...? body
  dictionaryVariable の中の各鍵に対応する変数と同じ名前の値を対応(dict update と似た方法で) させて body の中のTcl 記述譜を実行する｡ここでは､一つ乃至それ以上の鍵を利用でき､これは､最内の辞書が body の実行を始められる様な､入れ子になった辞書連鎖を意味している｡ dict update の場合と同じ様に､ dictionaryVariable を読めなくすると､辞書に対するその更新は遺棄され､もし､辞書の連鎖が存在しなくなる様に dictionaryVariable の内容が調整されたときも､そのようになる｡dict with の戻り値は(何かの不具合が起こらない限り) body の評価値である｡ もし､dictionaryVariable が無為設定の値が設定されいる配列に存在しない要素を指し示す場合､更新操作に先立つ辞書の値が無為設定の値として使われる｡ 　　 Execute the Tcl script in body with the value for each key in dictionaryVariable mapped (in a manner similarly to dict update) to a variable with the same name. Where one or more keys are available, these indicate a chain of nested dictionaries, with the innermost dictionary being the one opened out for the execution of body. As with dict update, making dictionaryVariable unreadable will make the updates to the dictionary be discarded, and this also happens if the contents of dictionaryVariable are adjusted so that the chain of dictionaries no longer exists. The result of dict with is (unless some kind of error occurs) the result of the evaluation of body. If dictionaryVariable indicates an element that does not exist of an array that has a default value set, the default value and will be used as the value of the dictionary prior to the updating operation.

  この変数は dict with を包み込む有効範囲の中で対応付けされる; この命令は局所的有効範囲(手続函数 proc､か､apply のλ項､か手段)の中でのみ使用することを推奨する｡理由は､ dict with によって設定された変数は命令が終わった後も(明示的に 削除する迄)存続し続ける為｡ The variables are mapped in the scope enclosing the dict with; it is recommended that this command only be used in a local scope (procedure, lambda term for apply, or method). Because of this, the variables set by dict with will continue to exist after the command finishes (unless explicitly unset).

  註意 値から変数への対応はtraces を使用しない; 辞書変数 の内容への変更は､ body が終了した時にのみ生じる｡ 　 Note that the mapping of values to variables does not use traces; changes to the dictionaryVariable's contents only happen when body terminates.

  もしこの dictionaryVariable が body が終了した時に辞書ではない値を含んでいる(それは､もし､その名前が辞書中のどれかの鍵の名前と同一であると容易に起り得る)と､その時点で不都合が発生する｡この命令は､従って､辞書中の鍵が dictionaryVariable の名前そのものと共に崩壊すると予想される時に使用することは推奨されない｡含まれた鍵こそが辞書に対応する処では､実の効果は内側の辞書を外側の辞書に入れて組合せることである､これを図示している下の EXAMPLES を参照されたい｡ 　　　 If the dictionaryVariable contains a value that is not a dictionary at the point when the body terminates (which can easily happen if the name is the same as any of the keys in dictionary) then an error occurs at that point. This command is thus not recommended for use when the keys in the dictionary are expected to clash with the dictionaryVariable name itself. Where the contained key does map to a dictionary, the net effect is to combine that inner dictionary into the outer dictionary; see the EXAMPLES below for an illustration of this.

### DICTIONARY VALUES

辞書は､任意の鍵から任意の値への､順序を維持した効率的な対応を､含んだ値である｡辞書の中の各鍵は一つの値に対応している｡それらは､構造のある書式を有し､正確な､偶数個の要素からなるある種のリストであって､辞書中のそれぞれの対応は､そのリストの二つの要素に対応する｡ある命令がある辞書を基に､新しい辞書を作る時(そのまま戻すにせよ､最初に読込んだ辞書の変数に記入して戻すにせよ)､その新しい辞書は､削除しなかった鍵を同じ順で有し､新しい鍵を末尾に追加する｡文字列が辞書として解釈される場合､その文字列が何かの加減で重複した鍵を有してしまうと､最後の値が使用され､それ以外は無視される､即ち､ ““林檎”バナナ” と ““林檎”人参 とは等価な辞書である（異なる文字列で表されてはいるが）｡ Dictionaries are values that contain an efficient, order-preserving mapping from arbitrary keys to arbitrary values. Each key in the dictionary maps to a single value. They have a textual format that is exactly that of any list with an even number of elements, with each mapping in the dictionary being represented as two items in the list. When a command takes a dictionary and produces a new dictionary based on it (either returning it or writing it back into the variable that the starting dictionary was read from) the new dictionary will have the same order of keys, modulo any deleted keys and with new keys added on to the end. When a string is interpreted as a dictionary and it would otherwise have duplicate keys, only the last value for a particular key is used; the others are ignored, meaning that, “apple banana” and “apple carrot apple banana” are equivalent dictionaries (with different string representations).

古い辞書から新しい辞書を得る様な操作(譬えば dict set や dict unset 等の更新 )では､その辞書中の鍵の順番は保持される｡ その例外は､序列に追加された何か新しい鍵であって､並びに追加されたものであって､且つ､並び順からえぐり取られて除かれた鍵でもある場合である｡ Operations that derive a new dictionary from an old one (e.g., updates like dict set and dict unset) preserve the order of keys in the dictionary. The exceptions to this are for any new keys they add, which are appended to the sequence, and any keys that are removed, which are excised from the order.

### 実施例 EXAMPLES

基本的な辞書の使用法: 　　 Basic dictionary usage:

    # 辞書に拡張子から説明文に対応させる
    # Make a dictionary to map extensions to descriptions
    set filetypes [dict create .txt "Text File" .tcl "Tcl File"]

    # その辞書に 追加/更新 する
    # Add/update the dictionary
    dict set filetypes .tcl "Tcl Script"
    dict set filetypes .tm  "Tcl Module"
    dict set filetypes .gif "GIF Image"
    dict set filetypes .png "PNG Image"

    # 辞書の簡明な読出し
    # Simple read from the dictionary
    set ext ".tcl"
    set desc [dict get $filetypes $ext]
    puts "$ext is for a $desc"

    # Somewhat more complex, with existence test
    foreach filename [glob *] {
        set ext [file extension $filename]
        if {[dict exists $filetypes $ext]} {
            puts "$filename is a [dict get $filetypes $ext]"
        }
    }

入れ子になった辞書の構築と使用: 　　 Constructing and using nested dictionaries:

    # ある従業員の資料
    # Data for one employee
    dict set employeeInfo 12345-A forenames "Joe"
    dict set employeeInfo 12345-A surname   "Schmoe"
    dict set employeeInfo 12345-A street "147 Short Street"
    dict set employeeInfo 12345-A city   "Springfield"
    dict set employeeInfo 12345-A phone  "555-1234"
    # 別の従業員の資料
    # Data for another employee
    dict set employeeInfo 98372-J forenames "Anne"
    dict set employeeInfo 98372-J surname   "Other"
    dict set employeeInfo 98372-J street "32995 Oakdale Way"
    dict set employeeInfo 98372-J city   "Springfield"
    dict set employeeInfo 98372-J phone  "555-8765"
    # この様な資料はデータベースに由来している筈であるが...
    # The above data probably ought to come from a database...

    # ある従業員の情報を印刷する
    # Print out some employee info
    set i 0
    puts "There are [dict size $employeeInfo] employees"
    dict for {id info} $employeeInfo {
        puts "Employee #[incr i]: $id"
        dict with info {
            puts "   Name: $forenames $surname"
            puts "   Address: $street, $city"
            puts "   Telephone: $phone"
        }
    }
    # 繰り返して名前を拾い上げる別法...
    # Another way to iterate and pick out names...
    foreach id [dict keys $employeeInfo] {
        puts "Hello, [dict get $employeeInfo $id forenames]!"
    }

string toupperの方言版: 　　 A localizable version of string toupper:

    # 基本的 C 地域情報を築く
    # Set up the basic C locale
    set capital [dict create C [dict create]]
    foreach c [split {abcdefghijklmnopqrstuvwxyz} ""] {
        dict set capital C $c [string toupper $c]
    }

    # 英語地域情報は幸いにも "C" localeを共有できる
    # English locales can luckily share the "C" locale
    dict set capital en [dict get $capital C]
    dict set capital en_US [dict get $capital C]
    dict set capital en_GB [dict get $capital C]

    # ... 更に運営されている他の言語にも ...
    # ... and so on for other supported languages ...

    # 現在の地域情報のための対応を取得し使用する｡
    # Now get the mapping for the current locale and use it.
    set upperCaseMap [dict get $capital $env(LANG)]
    set upperCase [string map $upperCaseMap $string]

dict with の詳細を示す:　　 Showing the detail of dict with:

    proc sumDictionary {varName} {
        upvar 1 $varName vbl
        foreach key [dict keys $vbl] {
            # 副辞書の中に見出しを作成する
            # Manufacture an entry in the subdictionary
            dict set vbl $key total 0
            # 値を加え古い値を削除
            # Add the values and remove the old
            dict with vbl $key {
                set total [expr {$x + $y + $z}]
                unset x y z
            }
        }
        puts "last total was $total, for key $key"
    }

    set myDict {
        a {x 1 y 2 z 3}
        b {x 6 y 5 z 4}
    }

    sumDictionary myDict
    #    印刷結果: last total was 15, for key b
    #    prints: last total was 15, for key b

    puts "dictionary is now \"$myDict\""
    #    印刷結果: dictionary is now "a {total 6} b {total 15}"
    #    prints: dictionary is now "a {total 6} b {total 15}"

dict with が､辞書変数の名前と共に崩壊する鍵と共に使われる時: When dict with is used with a key that clashes with the name of the dictionary variable:

    set foo {foo {a b} bar 2 baz 3}
    dict with foo {}
    puts $foo
    #    印刷結果: a b foo {a b} bar 2 baz 3
    #    prints: a b foo {a b} bar 2 baz 3

### 関連情報 SEE ALSO

append(n), array(n), foreach(n), incr(n), list(n), lappend(n), lmap(n), set(n)

### KEYWORDS

dictionary, create, update, lookup, iterate, filter, map
Copyright © 2003 Donal K. Fellows