Python 3の辞書を理解する

前書き

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

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

辞書は次のようになります。

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

中括弧に加えて、辞書全体にコロン(:)もあります。

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

  • 'username'

  • 'online'

  • 'followers'

上記の例の各キーはstringの値です。

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

  • 'sammy-shark'

  • True

  • 987

これらの各値は、文字列、Boolean、またはintegerのいずれかです。

辞書sammyを印刷してみましょう:

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

出力を見ると、キーと値のペアの順序がずれている可能性があります。 Pythonバージョン3.5以前では、辞書のデータ型は順不同です。 ただし、Pythonバージョン3.6以降では、辞書データ型の順序は変わりません。 ディクショナリが順序付けられているかどうかに関係なく、キーと値のペアはそのまま残り、関係の意味に基づいてデータにアクセスできます。

辞書要素へのアクセス

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

キーを使用したデータ項目へのアクセス

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

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

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

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

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

sammyディクショナリの残りの値は、同じ形式を使用して同様に呼び出すことができます。

sammy['followers']
# Returns 987

sammy['online']
# Returns True

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

メソッドを使用して要素にアクセスする

キーを使用して値にアクセスすることに加えて、いくつかの組み込みメソッドを使用することもできます。

  • dict.keys()はキーを分離します

  • dict.values()は値を分離します

  • dict.items()は、(key, value)タプルペアのリスト形式でアイテムを返します

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

print(sammy.keys())
Outputdict_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は、それぞれユーザープロファイル辞書です。

ただし、サミーにはフォロワーが関連付けられたソーシャルプロファイルがあり、ジェシーにはポイントが関連付けられたゲームプロファイルがあるため、プロファイルのキーは異なります。 それらに共通する2つのキーは、usernameonlineのステータスであり、この小さなプログラムを実行するとわかります。

Outputsammy-shark JOctopus
True False

プログラムを改善して出力をよりユーザーが読みやすくすることは確かですが、これは、dict.keys()を使用してさまざまな辞書をチェックし、それらが共通しているかどうかを確認できることを示しています。 これは、大規模な辞書に特に役立ちます。

同様に、dict.values()メソッドを使用して、sammy.values()として構築されるsammyディクショナリの値をクエリできます。 それらを印刷してみましょう:

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

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

メソッドkeys()values()はどちらも、それぞれdict_keysdict_valuesのビューオブジェクトを持つsammyディクショナリに存在するキーと値のソートされていないリストを返します。

辞書のすべての項目に関心がある場合は、items()メソッドを使用してそれらにアクセスできます。

print(sammy.items())
Outputdict_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)
Outputonline 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ディクショナリ内の項目を繰り返し処理し、キーと値を1行ずつ出力し、人間が理解しやすいように情報を提供しました。

組み込みのメソッドを使用して、ディクショナリデータ構造からアイテム、値、およびキーにアクセスできます。

辞書の変更

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

辞書要素の追加と変更

メソッドまたは関数を使用せずに、次の構文を使用してキーと値のペアを辞書に追加できます。

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

# Define original dictionary
usernames = {'Sammy': 'sammy-shark', 'Jamie': 'mantisshrimp54'}

# Set up while loop to iterate
while True:

    # Request user to enter a name
    print('Enter a name:')

    # Assign to name variable
    name = input()

    # Check whether name is in the dictionary and print feedback
    if name in usernames:
        print(usernames[name] + ' is the username of ' + name)

    # If the name is not in the dictionary...
    else:

        # Provide feedback
        print('I don\'t have ' + name + '\'s username, what is it?')

        # Take in a new username for the associated name
        username = input()

        # Assign username value to name key
        usernames[name] = username

        # Print feedback that the data was updated
        print('Data updated.')

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

python usernames.py

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

OutputEnter 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を押してプログラムをエスケープできます。 プログラムを終了するトリガー(文字qの入力など)をconditional statementで設定して、コードを改善できます。

これは、辞書をインタラクティブに変更する方法を示しています。 この特定のプログラムでは、CTRL + Cを使用してプログラムを終了するとすぐに、handle reading and writing filesへの方法を実装しない限り、すべてのデータが失われます。

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

以下の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()メソッドを使用して、特定のキーの特定の値を置き換えることにより、既存のキーと値のペアを変更することもできます。

sammyディクショナリでSammyのオンラインステータスを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辞書を見てみましょう。 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']は、キーと値のペア'points': 723jesseディクショナリから削除します。

すべての値のディクショナリをクリアしたい場合は、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の辞書データ構造について説明しました。 辞書はキーと値のペアで構成され、インデックス作成に依存せずにデータを保存する方法を提供します。 これにより、その意味と他のデータ型との関係に基づいて値を取得できます。

ここから、「https://www.digitalocean.com/community/tutorials/understanding-data-types-in-python-3 [データ型について]」チュートリアルで他のデータ型の詳細を学ぶことができます。

web scraping with Scrapyなどのプログラミングプロジェクトで使用される辞書データ型を確認できます。