連想配列ブロック

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 dictionarycreate 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 keysget 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 dictionarylist of pairs to dictionaryによって実行される変換list of pairs to dictionaryブロックに逆変換します。

辞書のペアのリストブロックが辞書のブロックのペアのリストを逆にする方法の例

コピー辞書

copy dictionaryは、指定された辞書のディープコピーを作成します。 つまり、すべての値が再帰的にコピーされ、コピーの値を変更しても元の値は変更されません。

辞書にマージする

merge into dictionary from dictionaryブロックmerge into dictionary from dictionarymerge into dictionary from dictionary別の辞書にキーと値のペアをコピーし、ターゲット辞書のキーを上書きします。

キーパスを歩いてリストする

list by walking key pathブロックのlist by walking key pathは、 get value at key pathget value at key pathと同様に機能get value at key pathが、単一の値を返すのではなく、値のリストを作成します。 これは、指定された辞書から開始し、指定されたパスに沿ってオブジェクトのツリーをたどることによって機能します。 ただし、 get value at key pathとは異なり、そのパスは、辞書キー、リストインデックス、 walk all at levelブロックでのwalk all at levelwalk all at levelの3つの主要なタイプで構成できます。 キーまたはインデックスが提供される場合、特定のパスがツリーのそのポイントで取得されます。 walk all at levelwalk 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 pathlist by walking key path参照してください。

辞書ですか?

is a dictionary? ブロックテストは、与えられたものが辞書であるかどうかを確認します。 thingが辞書の場合はtrueを返し、それ以外の場合はfalseを返しtrue 。

レファレンス