辞書型とは
辞書は、キー(名前)と値のペアを要素として管理できるデータ型。要素につけた名前(キー)を使って参照する。
- キーと値のペアの集合。キーに対応する値を取得できる。
- キーは、イミュータブル(変更不可)なものしか指定できない。
- 同じキーは1つだけもてる。複数追加すると上書きする。
- マップや連想配列と呼ぶこともある
辞書の作成
変数 = {キー1 : 値1, キー2 : 値2, ...}
辞書の要素はキー: 値
のペアで構成される。キーに使うのは、文字列でも数値でも可能。
辞書の要素は書き換え可能(ミュータブル)だが、キーだけの変更はできない(キーはイミュータブル)。変更する場合は要素(キー:値)ごと削除して、新しい要素を追加することになる。
辞書型基礎編
| 辞書を作成する
player = {'クリステファン・ローディ': 'FW', 'ジネディーヌ・ジダン': 'OMF', 'ラブレル・ガガ': 'CDF'}
| 空の辞書に追加する方法
player = {}
# player = dict() 上と同じ意味
player['クリステファン・ローディ'] = 'FW'
print(player)
player['ジネディーヌ・ジダン'] = 'OMF'
print(player)
{'クリステファン・ローディ': 'FW'}
{'クリステファン・ローディ': 'FW', 'ジネディーヌ・ジダン': 'OMF'}
| キーの値を変更
player = {'クリステファン・ローディ': 'FW', 'ジネディーヌ・ジダン': 'OMF', 'ラブレル・ガガ': 'CDF'}
player['クリステファン・ローディ'] = 'CF'
print(player)
{'クリステファン・ローディ': 'CF', 'ジネディーヌ・ジダン': 'OMF', 'ラブレル・ガガ': 'CDF'}
| 値の参照と要素の削除
print(player['ラブレル・ガガ'])
del player['ラブレル・ガガ']
print(player)
CDF
{'クリステファン・ローディ': 'FW', 'ジネディーヌ・ジダン': 'OMF'}
辞書の主なメソッド
メソッド等 | 説明 |
---|---|
get(key, default=None) |
key に対応する値を取得。存在しないときは、default を返す。 |
clear() |
全ての要素を削除。 |
copy() |
コピーを作成。 |
pop(key[, default]) |
key に対応する要素を削除し値を返す。存在しないときは、default が指定されていればそれを返し、なければエラー(KeyError)になる。 |
popitem() |
最後に追加された要素を削除(Python3.7以降)し、キーと値のタプルを返す。空だとエラー(KeyError)になる。 |
setdefault(key, default=None) |
key が存在するときは対応する値を返す。存在しないときはkey をdefault で設定し、default を返す。 |
update(other) |
別の辞書other の要素全てを追加。 |
dict.fromkeys(iterable, value=None) |
iterable の要素をキーに、値をvalue として辞書を作成。 |
| dict.fromkeys(iterable, value=None)
names = ['クリステファン・ローディ', 'ジネディーヌ・ジダン', 'ラブレル・ガガ']
player = dict.fromkeys(names, 'ポケサカ')
print(player)
{'クリステファン・ローディ': 'ポケサカ', 'ジネディーヌ・ジダン': 'ポケサカ', 'ラブレル・ガガ': 'ポケサカ'}
リストをキーとして、''ポケサカ'
を値とした辞書がつくられた。
| get(key, default=None)
print(player.get('デルビー・ベルコム', -1))
print(player.get('クリステファン・ローディ', -1))
-1
ポケサカ
キーが存在しない場合は-1を返し、存在する場合はその値を返した。
| setdefault(key, default=None)
print(player.setdefault('デルビー・ベルコム', 'ポケサカ'))
print(player)
print(player.setdefault('デルビー・ベルコム', 'ウイイレ'))
ポケサカ
{'クリステファン・ローディ': 'ポケサカ', 'ジネディーヌ・ジダン': 'ポケサカ', 'ラブレル・ガガ': 'ポケサカ', 'デルビー・ベルコム': 'ポケサカ'}
ポケサカ
| update(other)
wiele = {'クリスティアーノ・ロナウド': 'ウイイレ'}
player.update(wiele)
print(player)
wieleの辞書が追加された。
| pop(key), popitem()
print(player.pop('クリスティアーノ・ロナウド'))
print(player)
print(player.popitem())
print(player)
ウイイレ
{'クリステファン・ローディ': 'ポケサカ', 'ジネディーヌ・ジダン': 'ポケサカ', 'ラブレル・ガガ': 'ポケサカ', 'デルビー・ベルコム': 'ポケサカ'}
('デルビー・ベルコム', 'ポケサカ')
{'クリステファン・ローディ': 'ポケサカ', 'ジネディーヌ・ジダン': 'ポケサカ', 'ラブレル・ガガ': 'ポケサカ'}
| clear()
player.clear()
print(player)
{}
イテラブルを返すメソッド
※イテラブル:for文で繰り返せるオブジェクトまたはそのクラス
メソッド | 説明 |
---|---|
keys() |
キーを要素とするイテラブルを返します。 |
values() |
値を要素とするイテラブルを返します。 |
items() |
キーと値のタプルを要素とするイテラブルを返します。 |
player = {'クリステファン・ローディ': 'FW', 'ジネディーヌ・ジダン': 'OMF', 'ラブレル・ガガ': 'CDF'}
# キーだけを取り出す
for key in player.keys():
print(key)
# 値だけを取り出す
for value in player.values():
print(value)
# キーと値をセットで取り出す
for key, value in player.items():
print('{}: {}'.format(key, value))
クリステファン・ローディ
ジネディーヌ・ジダン
ラブレル・ガガ
FW
OMF
CDF
クリステファン・ローディ: FW
ジネディーヌ・ジダン: OMF
ラブレル・ガガ: CDF
辞書型応用編
| さまざまな辞書の作成方法
player = {'FW': 1, 'OMF': 2, 'CDF': 3}
player = dict(FW=1, OMF=2, CDF=3)
player = dict([('FW', 1), ('OMF', 2), ('CDF', 3)])
player = dict(**{'FW': 1, 'OMF': 2, 'CDF': 3})
上記の4通りはすべて同じ辞書を作る
| 2つのリストから辞書を作る
2つのリストの一方の要素をキー、もう一方のリストの要素を値にした辞書をつくることができる。
names = ['クリステファン・ローディ', 'ジネディーヌ・ジダン', 'ラブレル・ガガ']
positions = ['FW', 'OMF', 'CDF']
player = dict(zip(names, positions))
print(player)
{'クリステファン・ローディ': 'FW', 'ジネディーヌ・ジダン': 'OMF', 'ラブレル・ガガ': 'CDF'}
| 内包表記で辞書を作成する
2つのリストを内包表記を使って辞書にする。
names = ['クリステファン・ローディ', 'ジネディーヌ・ジダン', 'ラブレル・ガガ']
positions = ['FW', 'OMF', 'CDF']
player = {k: v for (k, v) in zip(names, positions)}
print(player)
{'クリステファン・ローディ': 'FW', 'ジネディーヌ・ジダン': 'OMF', 'ラブレル・ガガ': 'CDF'}
| キーの最大値とその時の値を取得
キーの最大値が'E'
, 値の最大値が5
となる辞書で考える。
d = {'E':1, 'D':2, 'C':3, 'B':5, 'A':4}
max_key = max(d)
print(max_key)
print(d[max_key])
E
1
| 値の最大値を取得
d = {'E':1, 'D':2, 'C':3, 'B':5, 'A':4}
max_value = max(d.values())
print(max_value)
5
| キーが最大となるキーと値のペアを取得
d = {'E':1, 'D':2, 'C':3, 'B':5, 'A':4}
max_item = max(d.items())
print(max_item)
('E', 1)
| 値が最大となるときのキーを取得
- max()のkeyパラメータを使う方法
d = {'E':1, 'D':2, 'C':3, 'B':5, 'A':4}
max_v_k = max(d.items(), key = lambda x:x[1])[0]
print(max_v_k)
B
- リスト内包表記を使う方法
d = {'E':1, 'D':2, 'C':3, 'B':5, 'A':4}
max_v_k = max((v, k) for k, v in d.items())[1]
print(max_v_k)
B
これらの方法は、最大値が複数ある場合は注意が必要になる。
keyパラメータを使う方法と、リスト内包表記を使う方法で結果が異なる場合がある。
d = {'E':1, 'D':2, 'C':3, 'B':5, 'F': 5, 'A':4}
# keyパラメータを使う方法
max_1 = max(d.items(), key = lambda x:x[1])[0]
print(max_1)
# リスト内包表記を使う方法
max_2 = max((v, k) for k, v in d.items())[1]
print(max_2)
B
F
Keyパラメータを使った場合は、辞書の値(value)の最大値のうち最初にヒットしたキー(key)を出力するのに対し、リスト内包表記を使った場合は、タプルの2番めの要素(上記例では”k”)が比較され、それが大きい方が出力される。
| 値が最大値の時のキーすべて取得
d = {'E':1, 'D':2, 'C':3, 'B':5, 'F': 5, 'A':4}
maxes = [k for k, v in d.items() if v == max(d.values())]
print(maxes)
['B', 'F']
| 辞書を値とする辞書を作成
キーに背番号、辞書型を値としてもつ辞書を作成
player = {
7: {'name': 'クリステファン・ローディ', 'attack': 409},
9: {'name': 'ルーズ・スレネス', 'attack': 397},
10: {'name': 'ジネディーヌ・ジダン', 'attack': 356}
}
print(player)
{7: {'name': 'クリステファン・ローディ', 'attack': 409}, 9: {'name': 'ルーズ・スレネス', 'attack': 397}, 10: {'name': 'ジネディーヌ・ジダン', 'attack': 356}}
print(player[7])
print(player[9]['name'])
print(player[10]['attack'])
{'name': 'クリステファン・ローディ', 'attack': 409}
ルーズ・スレネス
356
attackの値が最大の選手の背番号を取得する
player = {
7: {'name': 'クリステファン・ローディ', 'attack': 409},
9: {'name': 'ルーズ・スレネス', 'attack': 397},
10: {'name': 'ジネディーヌ・ジダン', 'attack': 356}
}
attack = {player[n]["attack"]: n for n in player.keys()}
max_attack = max(attack.keys())
print(attack[max_attack])
7
辞書型活用法
positions
にチームに所属する選手のポジションが入っている。ポジションごとの選手の人数を辞書teamに入れる。
positions = ['FW', 'MF', 'DF', 'GK', 'MF', 'MF', 'GK', 'FW', 'MF', 'MF', 'DF', 'DF']
team = dict.fromkeys(['FW', 'MF', 'DF', 'GK'], 0)
for position in positions:
team[position] += 1
for position, num in team.items():
print('{}: {}人'.format(position, num))
FW: 2人
MF: 5人
DF: 3人
GK: 2人
positions = ['CF', 'OMF', 'CDF', 'GK', 'OMF', 'DMF', 'GK', 'ST', 'MF', 'MF', 'SDF', 'SDF', 'WG', 'CF', 'CF', 'GK', 'OMF', 'ST', 'DMF']
team = dict()
for position in positions:
if position in team:
team[position] += 1
else:
team[position] = 1
for position, num in team.items():
print('{}: {}人'.format(position, num))
CF: 3人
OMF: 3人
CDF: 1人
GK: 3人
DMF: 2人
ST: 2人
MF: 2人
SDF: 2人
WG: 1人
set型を使うと以下のようにも書ける
positions = ['CF', 'OMF', 'CDF', 'GK', 'OMF', 'DMF', 'GK', 'ST', 'MF', 'MF', 'SDF', 'SDF', 'WG', 'CF', 'CF', 'GK', 'OMF', 'ST', 'DMF']
team = dict.fromkeys(set(positions), 0)
for position in positions:
team[position] += 1
for position, num in team.items():
print('{}: {}人'.format(position, num))
DMF: 2人
CDF: 1人
OMF: 3人
GK: 3人
ST: 2人
SDF: 2人
CF: 3人
MF: 2人
WG: 1人