連想配列ブロック
AI2連想配列
- 前書き
- 空の辞書を作成する
- 辞書を作る
- ペア
- キーの値を取得
- キーの設定値
- キーのエントリを削除します
- キーパスで値を取得
- キーパスの値を設定
- キーを取得
- 値を取得
- 辞書のキーは何ですか?
- 辞書のサイズ
- 辞書へのペアのリスト
- ペアのリストへの辞書
- コピー辞書
- 辞書にマージする
- キーパスを歩いてリストする
- すべてのレベルで歩く
- 辞書ですか?
前書き
マップ、連想配列、リストなど、他の言語で呼ばれる辞書は、キーと呼ばれることが多い値を別の値に関連付けるデータ構造です。 辞書を表示する一般的な方法は、たとえばJavaScript Object Notation(JSON)を使用することです。
{
"id"
:
1
,
"name"
:
"Tim the Beaver"
,
"school"
:
{
"name"
:
"Massachusetts Institute of Technology"
},
"enrolled"
:
true
,
"classes"
:
[
"6.001"
,
"18.01"
,
"8.01"
]
}
上記の例は、JSONではキー( :
前に引用されたテキスト)がさまざまなタイプの値にマップできることを示しています。 許可されるタイプは、数値、テキスト、他の辞書、ブール値、およびリストです。 ブロック言語では、次のようにしてこの辞書を作成できます。
図1 :上記のJSONコードスニペットのブロック表現。
空の辞書を作成する
create empty dictionary
のcreate empty dictionary
ブロックは、キーと値のペアなしで辞書を作成します。 set value for key
ブロックのset value for key
使用して、エントリを空の辞書に追加できます。 create empty dictionary
ブロックのcreate empty dictionary
は、青色のミューテーターボタンを使用してpair
エントリを追加するmake a dictionary
ブロックのcreate empty dictionary
変えることもできます。
辞書を作る
make a dictionary
作成は、事前に既知のpair
のセットで辞書を作成するために使用されます。 set value for key
使用して、追加のエントリを追加できset value for key
。
ペア
pair
ブロックは、辞書の作成に使用される特別な目的のブロックです。
キーの値を取得
get value for key
ブロックのget value for key
、指定されたキーに対応する値が辞書に含まれているかどうかを確認します。 存在する場合、値が返されます。 それ以外の場合、 not found
パラメーターの値が返さnot found
ます。 この動作はlookup in pairs
ブロックのlookup in pairs
の動作に似ています。
キーの設定値
set value for key
ブロックの設定値は、 dictionary
指定されたkey
に対応する値をvalueに設定しvalue
。 key
のマッピングが存在しない場合、新しいマッピングが作成されます。 それ以外の場合、既存の値は新しい値に置き換えられます。
キーのエントリを削除します
delete entry for key
ブロックのdelete entry for key
と、指定されたキーの辞書にあるキーと値のマッピングが削除されます。 キーのエントリがディクショナリに存在しない場合、ディクショナリは変更されません。
キーパスで値を取得
get value at key path
ブロックのget value for key
ブロックのget value for key
より高度なバージョンです。 特定のキーの値を取得するのではなく、データ構造内のパスを表す有効なキーと数値のリストを代わりに受け取ります。 get value for key
ブロックのget value for key
を含む長さ1のキーパスでこのブロックを使用することと同等です。 たとえば、次の2つのブロックは"Tim the Beaver"
返します。
複雑なデータ構造に深くネストされた値を取得するために提供されたpath
を使用して、最初の辞書から開始してデータ構造をウォークします。 WebサービスからのJSONデータの処理に最適です。 最初の入力から開始して、キーパスの最初の要素を取得し、その時点でキー(入力が辞書の場合)またはインデックス(入力がリストの場合)が存在するかどうかを確認します。 その場合、そのアイテムを入力として選択し、キーパスの次の要素のチェックに進みkey path
全体をたどるまで続行し、その時点でその場所にあるもの、または"not found"
パラメーターを返します。 。
例
{
"id"
:
1
,
"name"
:
"Tim the Beaver"
,
"school"
:
{
"name"
:
"Massachusetts Institute of Technology"
},
"enrolled"
:
true
,
"classes"
:
[
"6.001"
,
"18.01"
,
"8.01"
]
}
たとえば、上記のJSONディクショナリが与えられた場合、キーパスでget value at key path
次のように使用すると、 "Massachusetts Institute of Technology"
という結果が得られます。
get value at key path<
すると、辞書とリストが混在している場合に通過する要素のインデックスを表す数値をパスに含めることができます。 たとえば、Timが取っている2番目のクラスを知りたい場合、次のことができます。
値"18.01"
を返します。
キーパスの値を設定
set value for key path
ブロックのset value for key path
は、データ構造内の特定のキーパスの値を更新します。 キーパスのget value for key path
のミラーであり、特定のキーパスで値を取得します。 パスは 、マッピングが存在しない場合に新しい値へのマッピングを作成する最後のキーを除き、 有効である必要があります。 それ以外の場合、既存の値は新しい値に置き換えられます。
キーを取得
get keys
のget keys
は、ディクショナリ内のキーのリストを返します。
値を取得
get values
と、辞書の値を含むリストが返されます。 リスト内の値の内容を変更すると、辞書内の値も変更されます。
辞書のキーは何ですか?
is key in dictionary?
キーが辞書に存在するかどうかをテストし、存在する場合はtrue
を返し、そうでない場合はfalse
返しfalse
。
辞書のサイズ
size of dictionary
ブロックのsize of dictionary
存在するキーと値のペアの数を返します。
辞書へのペアのリスト
list of pairs to dictionary
ブロックへlist of pairs to dictionary
リストは、フォームの連想リスト((key1 value1) (key2 value2) ...)
を、キーをその値にマッピングする辞書に変換します。 辞書は連想リストよりも優れたルックアップパフォーマンスを提供するため、データ構造で多くの操作を実行する場合、このブロックを使用して連想リストを辞書に変換することをお勧めします。
ペアのリストへの辞書
dictionary to list of pairs
への辞書は、辞書を連想リストに変換します。 このブロックlist of pairs to dictionary
のlist of pairs to dictionary
によって実行される変換list of pairs to dictionary
ブロックに逆変換します。
コピー辞書
copy dictionary
は、指定された辞書のディープコピーを作成します。 つまり、すべての値が再帰的にコピーされ、コピーの値を変更しても元の値は変更されません。
辞書にマージする
merge into dictionary from dictionary
ブロックmerge into dictionary from dictionary
のmerge into dictionary from dictionary
別の辞書にキーと値のペアをコピーし、ターゲット辞書のキーを上書きします。
キーパスを歩いてリストする
list by walking key path
ブロックのlist by walking key path
は、 get value at key path
のget value at key path
と同様に機能get value at key path
が、単一の値を返すのではなく、値のリストを作成します。 これは、指定された辞書から開始し、指定されたパスに沿ってオブジェクトのツリーをたどることによって機能します。 ただし、 get value at key path
とは異なり、そのパスは、辞書キー、リストインデックス、 walk all at level
ブロックでのwalk all at level
のwalk all at level
の3つの主要なタイプで構成できます。 キーまたはインデックスが提供される場合、特定のパスがツリーのそのポイントで取得されます。 walk all at level
のwalk all at level
が指定されている場合、そのポイントのすべての値が連続して(幅優先)、そのポイントでパスの次の要素からウォークが継続されます。 パス全体に一致するすべての要素が出力リストに追加されます。
例
次のJSONとブロックを検討してください。
{
"people"
:
[{
"first_name"
:
"Tim"
,
"last_name"
:
"Beaver"
},{
"first_name"
:
"John"
,
"last_name"
:
"Smith"
,
},{
"first_name"
:
"Jane"
,
"last_name"
:
"Doe"
}]
}
global data
にJSONで表されるディクショナリが含まれている場合、キーパスブロックのlist by walking key path
リストはリスト["Tim", "Beaver"]
ます。 最初に、 "people"
タグの値、つまり人々のリストが選択されます。 次に、リストの最初の要素が選択されます。 最後に、Walk All at Levelブロックは、そのポイントのオブジェクトの値、つまり値"Tim"
および"Beaver"
ます。
リストを含むwalk all at level
で、レベルwalk all at level
使用することもできます。 たとえば、次のブロックは、構造内のすべての人々の名、つまり["Tim", "John", "Jane"]
ます。
このブロックは、 Web.XMLTextDecodeAsDictionary
ブロックを使用して解析されたXMLでも使用できます。 次のXMLドキュメントを検討してください。
<schedule>
<day>
<room
name=
"Hewlitt"
/>
<room
name=
"Bleil"
/>
</day>
<day>
<room
name=
"Kiva"
/>
<room
name=
"Star"
/>
</day>
</schedule>
次のブロックを使用して、最初の日に部屋の名前のリストを取得できます(例["Hewlitt", "Bleil"]
。
すべてのレベルで歩く
walk all at level
ブロックは、キーパスをwalk all at level
list by walking key path
キーパスで使用できる特殊なブロックです。 散歩中に遭遇すると、そのレベルのすべてのアイテムが探索されます。 辞書の場合、これはすべての値が訪問されることを意味します。 リストの場合、リスト内の各アイテムが訪問されます。 これを使用して、JSONオブジェクトで表されるデータベース内のすべての人の名など、辞書内のアイテムのリストから情報を集約できます。 例については、 list by walking key path
ブロックをlist by walking key path
てlist by walking key path
参照してください。
辞書ですか?
is a dictionary?
ブロックテストは、与えられたものが辞書であるかどうかを確認します。 thing
が辞書の場合はtrue
を返し、それ以外の場合はfalse
を返しtrue
。