【Python】dictionary(ディクショナリ)とはなんぞや?【辞書の使い方】

Python

この記事では、Pythonのdictionary(ディクショナリ)について解説します。

この記事で学べること
  • 辞書とは?
  • 辞書の基本的な使い方
  • 辞書のメソッドの使い方

辞書とは?

辞書とは、配列の一種で複数の要素を格納することができます。しかし、リストやタプルとは異なり、keyとvalueという2つの値を1組の要素として扱う特殊な配列です。

リストやタプルのようなシーケンス型では、格納した要素にアクセスするにはインデックスを使っていましたが、辞書ではkeyにvalueを関連付け、keyからvalueにアクセスすることができます。このようなkeyとなる値を任意のオブジェクトに対応付けるデータ型のことをマッピング型と呼びます。

辞書の特徴
  • keyとvalueで1つの要素
  • マッピング型である
  • 並びを保持しない
  • 連想配列や連想記憶と呼ばれたりする

辞書の宣言・初期化

辞書は以下のように宣言・初期化できます。

宣言

辞書を宣言するには{}を使います。

変数 = {}

dict()を使っても宣言できます

変数 = dict()

初期化

辞書を初期化するには{}内にkeyとvalueを:で区切って1組の要素とします。複数の要素を記述する場合は,(カンマ)で区切って記述します。

変数 = {key1: value1, key2: value2, ..., keyN: valueN}

サンプル

試しに辞書を作成して出力してみます。

d = {'key1': 1, 'key2': 2, 'key3': 3}

print(d)
print(type(d))

実行結果

{'key1': 1, 'key2': 2, 'key3': 3}
<class 'dict'>

要素を取得する

辞書の要素にアクセスするには、以下の方法があります。

keyからvalueを取得する

keyからvalueにアクセスすることができます。

書き方

以下のように[]内にアクセスしたいkeyを指定します。

辞書[key]

getメソッドを使用することでも値を呼び出せます。この呼び出しではkeyに関連付けられたvalueが存在しなくてもエラーになりません。

辞書.get(key)

サンプル

試しにkeyからvalueを取得してみます。

d = {'key1': 1, 'key2': 2, 'key3': 3} 

print(d['key1'])
print(d['key2'])
print(d['key3'])

実行結果

1
2
3

keyのみ取得[keysメソッド]

keysメソッドを使ってkeyのみを全て取得できます。

書式

以下のように記述します。

辞書.keys()

サンプル

試しに全てのkeyを取得してみます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}
keys = profile.keys()

print(keys)

実行結果

dict_keys(['name', 'age', 'gender'])

valueのみ取得[valuesメソッド]

valuesメソッドを使ってvalueのみを全て取得できます。

書式

以下のように記述します。

辞書.values()

サンプル

試しに全てのvalueを取得してみます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}
values = profile.values()

print(values)

実行結果

dict_values(['碇シンジ', '14', '男'])

keyとvalueを取得[itemsメソッド]

itemsメソッドを使ってkeyとvalueを全て取得できます。

書式

以下のように記述します。

辞書.items()

サンプル

試しに全てのkeyとvalueを取得してみます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}
items = profile.items()

print(items)

実行結果

dict_items([('name', '碇シンジ'), ('age', '14'), ('gender', '男')])

各要素にアクセスする[for文]

for文とitemsメソッドを組み合わせることで各要素にアクセスできます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}

for key, val in profile.items():
    print(f'key: {key}, value: {val}')

実行結果

key: name, value: 碇シンジ
key: age, value: 14
key: gender, value: 男

要素をバラバラに取得する[アンパック]

以下のように記述することでkeyをアンパックできます。

d = {'one': 1, 'two': 2, 'three': 3}

# アンパック
k1, k2, k3 = d

print(k1, k2, k3)

実行結果

one two three

関数に渡す際は**を変数の前に付けます。

d = {'one': 1, 'two': 2, 'three': 3}

def func(one, two, three):
    print(one)
    print(two)
    print(three)


# この呼び出しは、「func(one=1, two=2, three=3)」と等価
func(**d)

実行結果

1
2

要素の変更・追加

辞書の要素を変更・追加する方法を紹介します。

要素の変更・追加 [代入]

keyを指定してvalueを代入することで要素を変更・追加できます。
指定したkeyが存在する場合は、要素の変更となり、存在しない場合は、そのkeyとvalueを追加できます。

書式

以下のように記述します。

辞書[key] = value

サンプル

試しに要素の変更と追加をしてみます。

profile = {'name': '碇シンジ', 'age': '14'}

# 要素の変更
profile['name'] = '綾波レイ'

# 要素の追加
profile['gender'] = '女'

print(profile)

実行結果

{'name': '綾波レイ', 'age': '14', 'gender': '女'}

要素の変更・追加 [updateメソッド]

updateメソッドの引数に他の辞書を指定することで要素を変更・追加できます。
引数に指定された辞書のkeyが、元の辞書に存在する場合に要素は更新され、存在しない場合は要素が追加されます。

書式

以下のように記述します。

辞書1.update(辞書2)

サンプル

代入のサンプルと同じ処理をupdateメソッドを使って実行しています。

profile1 = {'name': '碇シンジ', 'age': '14'}
profile2 = {'name': '綾波レイ', 'gender': '女'}

profile1.update(profile2)

print(profile1)

実行結果

{'name': '綾波レイ', 'age': '14', 'gender': '女'}

nameキーはprofile1に存在したので更新され、genderキーはprofile1に存在しなかったので追加されました。

要素の追加 [setdefaultメソッド]

setdefaultメソッドを使って要素を追加できます。

書式

以下のように記述します。

辞書.setdefault(key, value)

サンプル

試しに要素を追加してみます。

profile = {'name': '碇シンジ', 'age': '14'}
profile.setdefault('gender', '男')
print(profile)

実行結果

{'name': '碇シンジ', 'age': '14', 'gender': '男'}

要素の削除

辞書の要素を削除する方法を紹介します。

指定した要素の削除[del文]

del文を使うことで指定した要素を削除できます。

書式

以下のように記述します。

del 辞書[key]

サンプル

試しに指定した要素を削除してみます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}

del profile['age']

print(profile)

実行結果

{'name': '碇シンジ', 'gender': '男'}

任意の要素を取り出す [popメソッド]

popメソッドを使って、指定したkeyに関連付けられているvalueを取り出せます。

書式

以下のように記述します。

辞書.pop(key)

リストのpopメソッドと違って、引数には必ずkeyを指定する必要があります。

サンプル

試しに要素を取り出してみます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}

age = profile.pop('age')

print(age)
print(profile)

実行結果

14
{'name': '碇シンジ', 'gender': '男'}

末尾の要素を取り出す[popitemメソッド]

popitemメソッドを使って、末尾のkeyとvalueをタプルとして取り出せます。

書式

以下のように記述します。

辞書.popitem()

サンプル

試しに要素を取り出してみます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}

gender = profile.popitem()
age = profile.popitem()

print(gender)
print(age)
print(profile)

実行結果

('gender', '男')
('age', '14')
{'name': '碇シンジ'}

全ての要素を削除する [clearメソッド]

clearメソッドを使って全ての要素を削除できます。

書式

以下のように記述します。

辞書.clear()

サンプル

試しに全ての要素を削除してみます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}
profile.clear()

print(profile)

実行結果

{}

長さの取得[len関数]

len関数を使って長さを取得できます。

書式

以下のように記述します。

len(辞書)

サンプル

試しに長さを取得してみます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}
length = len(profile)

print(length)

実行結果

3

keyの検索[in演算子]

in演算子を使うことで、辞書内に指定したkeyが存在するか確認できます。

書式

以下のように記述します。

検索したいkey in 辞書

サンプル

試しに指定したkeyが存在するか確認してみます。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}
age = 'age' in profile
hobby = 'hobby' in profile

print(age)
print(hobby)

実行結果

True
False

並び替え[sorted関数]

辞書にはsortメソッドが存在しないためsorted関数を使います。

書式

以下のように記述します。

sorted(辞書)

keyでソートして、keyのみ格納されたリストを返す

sorted関数の引数に、辞書を指定して実行してみる。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}
sort_profile = sorted(profile)

print(sort_profile)

実行結果

['age', 'gender', 'name']

ソートされたkeyがリストとして返されました。

keyでソートして、リストとして返す

sorted関数の引数に、辞書のitemsメソッドを指定して実行する。

profile = {'name': '碇シンジ', 'age': '14', 'gender': '男'}
sort_profile = sorted(profile.items())

print(sort_profile)

実行結果

[('age', '14'), ('gender', '男'), ('name', '碇シンジ')]

辞書ではなく、タプルを格納したリストとして返されるので気をつけてください。

valueでソートして、リストとして返す

sorted関数の第一引数に、辞書のitemsメソッドを指定し、第二引数でラムダを使ってソートする条件を指定しています。

以下のコードは、valueを基準に昇順で並び替えています。

profile = {'four': 4, 'three': 3, 'one': 1}
sort_profile = sorted(profile.items(), key=lambda v: v[1])

print(sort_profile)

実行結果

[('one', 1), ('three', 3), ('four', 4)]

辞書ではなく、タプルを格納したリストなので気をつけてください。

応用: リスト内に格納された辞書のソート

リストに格納された辞書もソートすることができます。

下の例はscoreキーで並び替えしてあります。

scores = [
    {'name': '朝倉', 'score': 91},
    {'name': 'ジョン・スミス', 'score': 63},
    {'name': '谷口', 'score': 34},
]

sort_scores = sorted(scores, key=lambda v: v['score'])
print(sort_scores)

実行結果

[{'name': '谷口', 'score': 34}, {'name': 'ジョン・スミス', 'score': 63}, {'name': '朝倉', 'score': 91}]

内包表記を使う

内包表記で{}を使うことで戻り値を辞書にすることができます。

書式

以下のように記述します。

辞書名 = {key: value for 変数 in 反復可能オブジェクト}

サンプル

試しに内包表記で辞書を作成してみます。

d = {i: i * i for i in range(3)}

print(d)

実行結果

{0: 0, 1: 1, 2: 4}

2つのリストから辞書を作成する [zip関数]

zip関数を使うことで、2つのリストを使って辞書を作成できます。

書式

以下のように記述します。

辞書名 = {key: value for key名, value名 in zip(リスト1, リスト2)}

サンプル

試しに2つのリストを作成し、そのリストから辞書を作成してみます。

keys = ['a', 'b', 'c']
values = [1, 2, 3]

d = {k: v for k, v in zip(keys, values)}
print(d)

実行結果

{'a': 1, 'b': 2, 'c': 3}

要素数が違う場合も試してみましょう!

keys = ['a', 'b', 'c', 'd']
values = [1, 2, 3]

d = {k: v for k, v in zip(keys, values)}
print(d)

実行結果

{'a': 1, 'b': 2, 'c': 3}

少ない要素数に合わせて処理されました!

まとめ

この記事では、Pythonの辞書の使い方を解説をしました。

今回のおさらい

簡単におさらいしておきましょう!

# 宣言・初期化
d = {'key1': 1, 'key2': 2}

# 要素にアクセス
print(d['key1'])  # 1

# 要素追加
d['key3'] = 3  # {'key1': 1, 'key2': 2, 'key3': 3}

# 要素削除
del d['key1']  # {'key2': 2, 'key3': 3}

# キー検索
'key1' in d  # False
'key2' in d  # True

リストだけでなく、用途に合わして辞書などの配列を使うことで、より強固なプログラムを作成できます。辞書は、他の配列に比べて覚えることが多いですが、何回も使って少しずつ慣れていきましょう。

それでは今回の内容はここまでです!それではまたどこかで〜( ・∀・)ノ

タイトルとURLをコピーしました