Python 3の辞書の理解

導入

辞書はPythonの組み込みマッピングタイプです。辞書はキーにマップし、これらのキーと値のペアはPythonでデータを格納する便利な方法を提供します。

通常、IDやユーザープロファイルに含まれる情報など、関連するデータを保持するために使用されます。辞書は、両側に波括弧 { } を使用して構築されます。

情報: このチュートリアルの例コードに従うには、python3 コマンドを実行してローカルシステムでPythonインタラクティブシェルを開きます。その後、>>> プロンプトの後にそれらを追加するか、コピーして貼り付けるか、編集できます。

A dictionary looks like this:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

波括弧の他に、辞書全体にコロン(:)があります。

コロンの左側の単語がキーです。キーは任意の不変データ型で構成できます。上記の辞書のキーは次のとおりです:

  • 'username'
  • 'online'
  • 'followers'

上記の例の各キーは文字列値です。

コロンの右側の単語が値です。は任意のデータ型で構成できます。上記の辞書の値は次のとおりです:

  • 'sammy-shark'
  • True
  • 987

これらの値のそれぞれは、文字列、ブール値、または整数です。

辞書sammyを出力してみましょう:

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': True}

出力を見ると、キーと値のペアの順序が変わっているかもしれません。Pythonバージョン3.5以前では、辞書データ型は順不同です。しかし、Pythonバージョン3.6以降では、辞書データ型は順序付けされたままです。辞書が順序付けされているかどうかに関係なく、キーと値のペアはそのまま保持されるため、関連する意味に基づいてデータにアクセスできます。

前提条件

Python 3がインストールされ、コンピュータまたはサーバーにプログラミング環境が設定されている必要があります。プログラミング環境が設定されていない場合は、ローカルプログラミング環境またはサーバー上のプログラミング環境に関するインストールおよび設定ガイドを参照してください(Ubuntu、CentOS、Debianなど、お使いのオペレーティングシステムに適したもの)。

辞書要素へのアクセス

関連するキーを参照することで、辞書の値を呼び出すことができます。

キーでデータ項目にアクセスする

辞書はデータを格納するためのキーと値のペアを提供するため、Pythonプログラムで重要な要素となります。

Sammyのユーザー名を分離したい場合は、sammy['username']を呼び出すことで行うことができます。それを出力してみましょう:

print(sammy['username'])
Output
sammy-shark

辞書は、リストのように特定のインデックス値を取得するために整数を呼び出すのではなく、値をキーに割り当て、そのキーを呼び出して関連する値を取得する点でデータベースのように振る舞います。

キー'username'を呼び出すことで、そのキーの値である'sammy-shark'を受け取ります。

残りの値は、同じ形式でsammy辞書から呼び出すことができます:

sammy['followers']
# 987を返す

sammy['online']
# Trueを返す

辞書のキーと値のペアを利用することで、キーを参照して値を取得することができます。

要素にアクセスする方法の使用

値にアクセスするためにキーを使用するだけでなく、いくつかの組み込みメソッドを使用することもできます。

  • dict.keys()はキーを分離します
  • dict.values()は値を分離します
  • dict.items()は、(key、value)のタプルのペアのリスト形式のアイテムを返します

キーを返すには、dict.keys()メソッドを使用します。この場合、変数名を使用してsammy.keys()となります。それをprint()メソッドに渡して出力を見てみましょう。

print(sammy.keys())
Output
dict_keys(['followers', 'username', 'online'])

私たちは、キーがdict_keysクラスの反復可能なビューオブジェクト内に配置される出力を受け取ります。その後、キーがリスト形式で印刷されます。

このメソッドは辞書全体を検索するために使用できます。たとえば、2つの辞書データ構造間で共有される共通のキーを見ることができます。

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}
jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

for common_key in sammy.keys() & jesse.keys():
    print(sammy[common_key], jesse[common_key])

辞書sammyと辞書jesseは、それぞれユーザープロファイル辞書です。

彼らのプロファイルには異なるキーがありますが、Sammyは関連するフォロワーを持つソーシャルプロファイルを持ち、Jesseは関連するポイントを持つゲームプロファイルを持っています。彼らが共通して持っている2つのキーはusernameonlineステータスであり、この小さなプログラムを実行するとそれらを見つけることができます。

Output
sammy-shark JOctopus True False

プログラムを改善して、出力をよりユーザーが読みやすくすることはできますが、これはdict.keys()がさまざまな辞書をチェックして共通点を見つけるために使用できることを示しています。これは特に大規模な辞書に対して便利です。

同様に、dict.values()メソッドを使用してsammy辞書内の値をクエリできます。これはsammy.values()として構築されます。それらを出力してみましょう:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

print(sammy.values())
Output
dict_values([True, 'sammy-shark', 987])

keys()およびvalues()メソッドの両方は、sammy辞書内のキーと値を表すdict_keysおよびdict_valuesのビューオブジェクトを使用して、ソートされていないリストを返します。

辞書内のすべてのアイテムに興味がある場合は、items()メソッドを使用してそれらにアクセスできます:

print(sammy.items())
Output
dict_items([('online', True), ('username', 'sammy-shark'), ('followers', 987)])

これの返される形式は、dict_itemsのビューオブジェクトとともに(key, value)タプルのペアで構成されたリストです。

返されたリスト形式をforループで反復処理できます。たとえば、特定の辞書の各キーと値を出力し、それをより人間が読みやすいように文字列を追加することができます:

for key, value in sammy.items():
    print(key, 'is the key for the value', value)
Output
online is the key for the value True followers is the key for the value 987 username is the key for the value sammy-shark

上記のforループは、sammy辞書内のアイテムを反復処理し、キーと値を行ごとに出力し、それを人間が理解しやすくするための情報を提供しました。

辞書データ構造からアイテム、値、キーにアクセスするために組み込みメソッドを使用できます。

辞書の変更

辞書は変更可能なデータ構造なので、それらを変更することができます。このセクションでは、辞書要素の追加と削除について説明します。

辞書要素の追加と変更

メソッドや関数を使用せずに、以下の構文を使って辞書にキーと値のペアを追加できます:

dict[key] = value

これがどのように機能するかを見てみましょう。辞書にusernamesという名前のキーと値のペアを追加します:

usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

usernames['Drew'] = 'squidly'

print(usernames)
Output
{'Drew': 'squidly', 'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

辞書が'Drew': 'squidly'のキーと値のペアで更新されたことがわかります。辞書は順序付けされていない可能性があるため、このペアは辞書の出力のどこにでも現れるかもしれません。後でプログラムファイルでusernames辞書を使用すると、追加されたキーと値のペアが含まれます。

さらに、この構文は、キーに割り当てられた値を変更するためにも使用できます。この場合、既存のキーを参照し、異なる値を渡します。

与えられたネットワーク上のユーザーの1つである辞書drewを考えてみましょう。今日、このユーザーがフォロワーを増やしたとします。したがって、'followers'キーに渡される整数値を更新する必要があります。辞書が変更されたことを確認するために、print()関数を使用します。

drew = {'username': 'squidly', 'online': True, 'followers': 305}

drew['followers'] = 342

print(drew)
Output
{'username': 'squidly', 'followers': 342, 'online': True}

出力では、フォロワー数が整数値305から342に増加したことが分かります。

この方法を使用して、ユーザー入力で辞書にキーと値のペアを追加できます。ユーザー名と関連するユーザー名を追加するためのコマンドライン上で実行されるusernames.pyというプログラムを書いてみましょう。

usernames.py
# 元の辞書を定義
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

# 繰り返し処理を行うためのwhileループを設定
while True:

    # ユーザーに名前を入力するように要求
    print('Enter a name:')

    # 名前変数に割り当てる
    name = input()

    # 名前が辞書にあるかどうかを確認し、フィードバックを表示
    if name in usernames:
        print(usernames[name] + ' is the username of ' + name)

    # もし名前が辞書にない場合...
    else:

        # フィードバックを提供
        print('I don\'t have ' + name + '\'s username, what is it?')

        # 関連する名前に新しいユーザー名を取得
        username = input()

        # ユーザー名の値を名前キーに割り当てる
        usernames[name] = username

        # データが更新されたことを示すフィードバックを表示
        print('Data updated.')

プログラムをコマンドラインで実行しましょう:

  1. python usernames.py

プログラムを実行すると、次のような出力が得られます:

Output
Enter a name: Sammy sammy-shark is the username of Sammy Enter a name: Jesse I don't have Jesse's username, what is it? JOctopus Data updated. Enter a name:

プログラムのテストが終了したら、プログラムを終了するためにCTRL + Cを押すことができます。コードを改善するために条件文を使用してプログラムを終了するトリガーを設定することができます。

これは、辞書をインタラクティブに変更する方法を示しています。特定のプログラムでは、CTRL + Cでプログラムを終了すると、データがすべて失われます。ファイルの読み取りと書き込みを処理する方法を実装しない限り、データは失われます。

また、dict.update()メソッドを使用して辞書を追加および変更することができます。これは、リストで利用可能なappend() メソッドとは異なります。

以下のjesse辞書では、キー'followers'を追加し、整数値を与えましょう。jesse.update()を使用します。その後、更新された辞書をprint()します。

jesse = {'username': 'JOctopus', 'online': False, 'points': 723}

jesse.update({'followers': 481})

print(jesse)
Output
{'followers': 481, 'username': 'JOctopus', 'points': 723, 'online': False}

出力から、'followers': 481のキーと値が辞書jesseに正常に追加されたことがわかります。

また、特定のキーに対する指定された値を置き換えることで、既存のキーと値のペアを変更するためにdict.update()メソッドを使用することもできます。

サミーのオンライン状態をTrueからFalseに変更しましょう:

sammy = {'username': 'sammy-shark', 'online': True, 'followers': 987}

sammy.update({'online': False})

print(sammy)
Output
{'username': 'sammy-shark', 'followers': 987, 'online': False}

sammy.update({'online': False})は既存のキー'online'を参照し、そのブール値をTrueからFalseに変更します。辞書をprint()すると、更新が出力に反映されます。

辞書にアイテムを追加したり値を変更するには、dict[key] = valueの構文またはdict.update()メソッドを使用できます。

辞書要素の削除

辞書データ型内でキーと値を追加したり値を変更できるだけでなく、辞書内のアイテムを削除することもできます。

辞書からキーと値のペアを削除するには、次の構文を使用します:

del dict[key]

ユーザーの1人を表すjesse辞書を取り上げましょう。ジェシーがゲームのオンラインプラットフォームを使用しなくなったとしますので、'points'キーに関連付けられたアイテムを削除します。その後、辞書を印刷して、アイテムが削除されたことを確認します:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

del jesse['points']

print(jesse)
Output
{'online': False, 'username': 'JOctopus', 'followers': 481}

del jesse['points']jesse辞書からキーと値のペア'points': 723を削除します。

辞書のすべての値をクリアしたい場合、dict.clear()メソッドを使用できます。これにより、プログラムの後で再利用する必要がある場合に、指定された辞書が保持されますが、もはやアイテムを含みません。

以下のように、jesse辞書内のすべてのアイテムを削除しましょう:

jesse = {'username': 'JOctopus', 'online': False, 'points': 723, 'followers': 481}

jesse.clear()

print(jesse)
Output
{}

出力は、キーと値のペアがない空の辞書を示しています。

特定の辞書がもはや必要ない場合、それを完全に削除するためにdelを使用できます:

del jesse

print(jesse)

jesse辞書を削除した後にprint()を呼び出すと、次のエラーが発生します:

Output
... NameError: name 'jesse' is not defined

辞書は可変データ型であるため、追加、変更、アイテムの削除、クリアができます。

結論

このチュートリアルでは、Pythonの辞書データ構造について説明しました。辞書はキーと値のペアで構成され、インデックスに依存せずにデータを格納する方法を提供します。これにより、他のデータ型との関係や意味に基づいて値を取得できます。

次に、「データ型の理解」チュートリアルで他のデータ型について学ぶことができます。

プログラミングプロジェクトで使用される辞書データ型は、Scrapyを使用したウェブスクレイピングなどに見られます。

Source:
https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3