Python ディクショナリの概要

完了

Python の変数では、さまざまなデータ型を格納できます。 前に、文字列と数値を格納できる方法を学習しました。

name = 'Earth'
moons = 1

この方法は少量のデータに対してはうまくいきますが、関連データを操作するときにますます複雑になる可能性があります。 地球の衛星と木星の衛星に関する情報を格納するとします。

earth_name = 'Earth'
earth_moons = 1

jupiter_name = 'Jupiter'
jupiter_moons = 79

異なるプレフィックスを持つ変数を複製した方法に注意してください。 この複製により、扱いにくくなる可能性があります。 異なる都市の異なる月の平均降水量など、関連するデータ セットを使用する場合が多いので、これらの変数を個々の値として格納する方法は有効ではありません。 代わりに、Python ディクショナリを使用できます。

Python ディクショナリを使用すると、関連するデータ セットを使用できます。 "ディクショナリ" とは、キーと値のペアのコレクションです。 これをコンテナー内の変数のグループのように考えます。ここで、キーは変数の名前、値はその中に格納されている値です。

ディクショナリを作成する

Python では、中かっこ ({ }) とコロン (:) を使用してディクショナリを表します。 空のディクショナリを作成して後で値を追加するか、作成時に値を設定することができます。 各キーと値はコロンで区切り、各キーの名前は文字列リテラルとして引用符で囲みます。 キーは文字列リテラルなので、値を説明するために適切な任意の名前を使用できます。

地球の名前と地球が持つ月の数を格納するディクショナリを作成しましょう。

planet = {
    'name': 'Earth',
    'moons': 1
}

'name''moons' の 2 つのキーがあります。 それぞれのキーは変数と同じように動作します。一意の名前を持ち、値を格納します。 ただし、これらは planet という名前の 1 つの大きい変数の中に格納されます。

通常の変数と同様に、正しいデータ型を使用していることを確認する必要があります。 前の例の moons の値 1 では、整数を使用したいため、数値を引用符で囲みませんでした。 '1' を使用した場合、Python はこの変数を文字列と見なします。これは、計算を実行する機能に影響します。

通常の変数とは異なり、キー名は Python の標準的な名前指定の規則に従う必要が "ありません"。 キー名を使用すると、コード内でさらにわかりやすくできます。

ディクショナリ値を読み取る

ディクショナリ内の値を読み取ることができます。 ディクショナリ オブジェクトには、キーを使用して値にアクセスするために使用できる get メソッドがあります。 name を出力する場合は、次のコードを使用できます。

print(planet.get('name'))
Earth

ご想像のとおり、ディクショナリの値へのアクセスは一般的な操作です。 さいわい、ショートカットがあります。 キーを角かっこ表記 ([ ]) に渡すこともできます。 この方法は get より使用するコードが少なく、ほとんどのプログラマは代わりにこの構文を使用します。 次のコードを使って、前の例を書き直すことができます。

# planet['name'] is identical to using planet.get('name')
print(planet['name'])
Earth

get と角かっこ ([ ]) の動作は通常、項目を取得する場合と同じですが、1 つの重要な違いがあります。 キーが使用できない場合、getNone を返し、[ ]KeyError を発生させます。

wibble = planet.get('wibble') # Returns None
wibble = planet['wibble'] # Throws KeyError

ディクショナリ値を変更する

update メソッドを使用して、ディクショナリ オブジェクト内の値を変更することもできます。 このメソッドは、ディクショナリをパラメーターとして受け取り、指定した新しい値で既存の値を更新します。 planet ディクショナリの name を変更する場合は、たとえば次のコードを使用できます。

planet.update({'name': 'Makemake'})

# No output: name is now set to Makemake.

角かっこ ([ ]) ショートカットを使用して値を読み取るのと同様に、同じショートカットを使用して値を変更できます。 構文の主な違いは、= ("代入" 演算子とも呼ばれる) を使用して新しい値を提供する点です。 前の例を書き換えて名前を変更するには、次のコードを使います。

planet['name'] = 'Makemake'

# No output: name is now set to Makemake.

update を使用する主な利点は、1 回の操作で複数の値を変更する機能です。 次の 2 つの例は論理的には同じですが、構文は異なります。 最適と思う構文を自由に使用できます。 個々の値を更新する場合、ほとんどの開発者は角かっこを選択します。

次の例では、planet 変数に対して同じ編集を行い、名前と月を更新します。 update を使用して関数を 1 回呼び出すのに対し、角かっこを使用する場合は 2 回の呼び出しが含まれる点に注意してください。

更新プログラムの使用:

planet.update({
    'name': 'Jupiter',
    'moons': 79
})

角かっこの使用:

planet['name'] = 'Jupiter'
planet['moons'] = 79

キーの追加と削除

ディクショナリを初期化するときに、すべてのキーを作成する必要はありません。 実際、作成する必要はありません。 新しいキーを作成する場合は、既存のキーと同じ方法で割り当てます。

たとえば、公転周期 (日数) を含むように planet を更新するとします。

planet['orbital period'] = 4333

# planet dictionary now contains: {
#   name: 'jupiter'
#   moons: 79
#   orbital period: 4333
# }

重要

キー名は、Python の他のすべてと同様に、大文字と小文字が区別されます。 その結果、'name''Name' は、Python ディクショナリで 2 つの個別のキーと見なされます。

キーを削除するには、pop を使用します。 pop は値を返し、ディクショナリからキーを削除します。 orbital period を削除するには、次のコードを使用できます。

planet.pop('orbital period')

# planet dictionary now contains: {
#   name: 'jupiter'
#   moons: 79
# }

複合データ型

ディクショナリは、他のディクショナリを含め、任意の型の値を格納できます。 これにより、必要に応じて複雑なデータをモデル化できます。 planet の直径を格納する必要がある場合は、赤道または極方向に測定できます。 planet 内に別のディクショナリを作成して、この情報を格納できます。

# Add address
planet['diameter (km)'] = {
    'polar': 133709,
    'equatorial': 142984
}

# planet dictionary now contains: {
#   name: 'Jupiter'
#   moons: 79
#   diameter (km): {
#      polar: 133709
#      equatorial: 142984
#   }
# }

入れ子になったディクショナリの値を取得するには、角かっこを組み合わせるか、または get を呼び出します。

print(f'{planet["name"]} polar diameter: {planet["diameter (km)"]["polar"]}')
Jupiter polar diameter: 133709