【Python】辞書(dict)の使い方。名前で管理するデータ構造【入門第29回】

122, 2019-08-22

目次

辞書とは?

こんにちは、narupoです。

今回はPythonのデータ型の1つである辞書(dict)をやっていきたいと思います。
プログラマーが無人島に持っていきたいデータ構造、第1位の呼び声も高い辞書ですが、どういった特徴があるのでしょうか?
辞書は、データを文字列の名前で管理します。
リストやタプルは、数値の添え字で要素にアクセスしていましたが、辞書では文字列を使ってアクセスすることができます。
この辞書はPythonのプログラミングでめちゃくちゃ利用頻度が高いデータ型です。
この記事を読んで使えるようになっておきましょう。

具体的には↓を見ていきます。

  • 辞書の作り方

  • 辞書を出力する

  • 辞書の長さを得る(len)

  • 辞書へのアクセス

  • 辞書から要素を削除

  • 辞書を更新(update)

  • 辞書をコピー(copy)

  • 辞書をfor文で回す

  • リスト、タプルを辞書に変換する

  • 辞書の内包表記

※初心者の方はこの記事の内容をいきなりぜんぶ覚える必要はありません。
※辞書が必要になったらこの記事を参照するようにしてみてください。

辞書の作り方

辞書を作るには波括弧({}を使います。
↓のようにすると空の辞書を作ることができます。

{}

辞書に値を入れるにはその値の名前と一緒に入れます。
このとき、その名前をキーと言います。

{
    'cat': 1,
}

↑のように'キー': 値というふうに値を入れます。
この'キー': 値のセットをアイテム(または要素)と言います。
こうすることで値にキーが関連付けられています。
キーと値はカンマ(,)で区切って複数入れることができます。

{
    'cat': 1,
    'dog': 2,
    'bird': 3,
}

1つの辞書には、ひとつのキーしか入れることができません。
たとえばcatというキーを2つ以上入れた場合、キーは最後にいれたもので上書きされます。

{
    'cat': 1,
    'cat': 2,
}

↑では一見するとcatが2つ入ってますが、'cat': 1'cat': 2で上書きされています。
辞書は変数に入れることも出来ます。

d = {
    'cat': 1,
}

また、空の辞書はdictクラスを使っても作ることができます。

d = dict()

辞書を出力する

辞書を出力するにはprintを使います。

d = {
    'cat': 1,
}

print(d)

↑のコードの実行結果は↓のようになります。

{'cat': 1}

辞書の長さを得る(len)

辞書の長さ(要素数)を得るにはlen関数を使います。

d = {
    'cat': 1,
    'dog': 2,
}

print(len(d))

↑のコードの実行結果は↓のようになります。

2

辞書へのアクセス

辞書には添え字などを使ってアクセスすることができます。
基本的にはキーを指定して値を取得/設定します。

添え字によるアクセス

添え字によるアクセスは角カッコ([])とキーを使います。
たとえば↓のようにです。

d = {
    'cat': 1,
}

print(d['cat'])

↑のコードの実行結果は1になります。
角カッコのアクセスでは、キーが存在しない場合はKeyErrorになります。

d['nothing']

↑のコードの実行結果は↓のようになります。

KeyError: 'nothing'

キーの値を上書きするには↓のように=を使います。

d['cat'] = 20

get

辞書のgetメソッドを使っても値を取得できます。

d = {
    'cat': 1,
}

print(d.get('cat'))

↑のコードの実行結果は1になります。
getメソッドは辞書にキーが無かった場合はNoneを返します。

print(d.get('nothing'))

↑のコードの実行結果はNoneになります。
キーが見つからなかったときに、Noneではなく別の値を返してほしい場合は↓のようにgetの第2引数に値を指定します。

print(d.get('nothing', 123))

↑のコードの実行結果は123になります。
nothingというキーが見つからなかったので、デフォルト値である123を返してるわけですね。

keys

辞書からキーのリストを取得するにはkeysメソッドを使います。

d = {
    'cat': 1,
    'dog': 2,
}

print(d.keys())

↑のコードの出力結果は↓のようになります。

dict_keys(['cat', 'dog'])

↑のdict_keysは見慣れないデータ型ですが、これはlist()に渡すことでリストに変換することができます。

print(list(d.keys()))

↑のコードの実行結果は↓のようになります。

['cat', 'dog'] 

もちろんdict_keystuple()set()にも渡すことができます。

values

辞書から値のリストを取得するにはvaluesメソッドを使います。

d = {
    'cat': 1,
    'dog': 2,
}

print(d.values())

↑のコードの出力結果は↓のようになります。

dict_values([1, 2])

↑のdict_valueslist()に渡せばリストに変換できます。

print(list(d.values()))

↑のコードの実行結果は↓のようになります。

[1, 2]

もちろんdict_valuestuple()set()にも渡すことができます。

items

キーと値のセット(アイテム)のリストを取得するにはitemsメソッドを使います。

d = {
    'cat': 1,
    'dog': 2,
}

print(d.items())

↑のコードの実行結果は↓のようになります。

dict_items([('cat', 1), ('dog', 2)])

dict_itemslist()に渡すことでリストに変換することができます。

print(list(d.items()))

↑のコードの実行結果は↓のようになります。

[('cat', 1), ('dog', 2)]

↑を見ると、キーと値がタプルでパックされてることがわかると思います。
もちろんdict_itemstuple()set()にも渡すことができます。

辞書から要素を削除

辞書から値を削除するにはいろいろな方法があります。
よく使われるのはpopです。

pop

popメソッドを使うとキーの値をポップして削除することができます。

d = {
    'cat': 1,
    'dog': 2,
}

print(d.pop('cat'))

↑のコードの実行結果は1になります。
このようにpopはキーの値を返して、そのキーのアイテムを削除します。
よって、辞書dからはキーcatのアイテムが削除されます。

popメソッドも、辞書にキーが存在しない場合はKeyErrorになります。

d.pop('nothing')

↑のコードの実行結果は↓のようになります。

KeyError: 'nothing'

popメソッドも第2引数にデフォルト値を指定することができます。

d.pop('nothing', 123)

↑の例では、nothingというキーが辞書になかった場合に、pop123を返します。

popitem

popitempopと似ています。
popが値を返すのに対して、popitemはアイテムを返します。

d = {
    'cat': 1,
    'dog': 2,
}

print(d.popitem())
print(d.popitem())

popitemはキーを指定できません。
その代わり、popitemは実行されると末尾のアイテムをポップします。
↑のコードの実行結果は↓のようになります。

('dog', 2)
('cat', 1)

↑ポップされたアイテムがタプルになっているのがわかります。
popitemは辞書が空の場合、KeyErrorを返します。

d = {}
d.popitem()

↑のコードの実行結果は↓のようになります。

KeyError: 'popitem(): dictionary is empty'

del文

del文を使ってアイテムを削除することも出来ます。

d = {
    'cat': 1,
    'dog': 2,
}

del d['cat']

print(d)

↑のコードの実行結果は↓のようになります。

{'dog': 2}

clear

辞書を空にするにはclearメソッドを使います。

d = {
    'cat': 1,
    'dog': 2,
}

d.clear()

print(d)

↑のコードの実行結果は↓のようになります。

{}

爽快

辞書を更新(update)

辞書を他の辞書で更新するにはupdateメソッドを使います。
↓のようにd1の辞書をd2の辞書で更新してみましょう。

d1 = {
    'cat': 1,
}
d2 = {
    'dog': 2,
}

d1.update(d2)

print(d1)

↑のコードの実行結果は↓のようになります。
d1の辞書の内容がd2の辞書の内容で更新されてますね。

{'cat': 1, 'dog': 2}

辞書をコピー(copy)

辞書をコピーするにはcopyメソッドを使います。

d1 = {'cat': 1}
d2 = d1.copy()

print(d2)

↑のコードの実行結果は↓のようになります。

{'cat': 1}

辞書をfor文で回す

辞書はfor文で回すことができます。

d = {
    'cat': 1,
    'dog': 2,
}

for key in d:
    print(key)

↑のコードの実行結果は↓のようになります。

cat
dog

↑のように、辞書はそのままfor文に回すとキーを次々に取り出します。
これは先ほど紹介したkeysメソッドを使うのと同じです。
値を取り出したい場合は先ほど紹介したvaluesメソッドを使います。

for val in d.values():
    print(val)

↑のコードの実行結果は↓のようになります。

1
2

キーと値を同時に取り出したい場合はitemsメソッドを使います。

for item in d.items():
    print(item[0], item[1])

↑これは↓と同じです。

for key, val in d.items():
    print(key, val)

↑のコードの実行結果はどちらも↓のようになります。

cat 1
dog 2

リスト、タプルを辞書に変換する

リストやタプルを辞書に変換することも出来ます。
たとえば↓のようなリストがあるとします。

lst = [('cat', 1), ('dog', 2)]

↑を辞書に変換するにはdictクラスを使います。

lst = [('cat', 1), ('dog', 2)]
d = dict(lst)
print(d)

↑のコードの実行結果は↓のようになります。

{'cat': 1, 'dog': 2}

もちろんタプルを変換することも出来ます。

tpl = (('cat', 1), ('dog', 2))
d = dict(tpl)
print(d)

↑のコードの実行結果は先ほどと同じになります。
リストもタプルも、キーと値をタプルでパックしている所が同じですね。

辞書の内包表記

辞書は内包表記で作ることも出来ます。

d = {i:i for i in range(4)}
print(d)

↑のコードの実行結果は↓のようになります。

{0: 0, 1: 1, 2: 2, 3: 3}

あまり使い道はありません

おわりに

辞書! あまたのプログラマーがその便利さの前に膝を突き慈悲を乞うてきた!
キーとヴァリューの饗宴! 人々はその威力に酔いしれ使うことをためらわない!
まさにデータ構造の王! その名は辞書!

さぁ、きみもこのデータ型に病みつきになろう

だいじょうぶ、みんなやってるよ

以上、次回に続きます。

また見てね

関連動画

スポンサーリンク

スポンサーリンク

スポンサーリンク

スポンサーリンク