辞書の基本

投稿者: | 2022-05-31

目次

辞書を使う

  • その前にリストとは
    • リストは複数の要素を順番に管理でき、簡単に取り出せる
    • デメリット:要素の内容と順番を覚えておかなければならない
  • 辞書であれば情報を「見出しキー」と「値」で管理できる

つくる

リストから辞書を作る

辞書をリテラルとして生成

{キー1:値1, キー2:値2, キー3:値3, ...}

langs = {'python':100, 'JavaScript':20, 'Swift':3, 'C':33}

dict()から生成

  • 辞書内のキーの順序はきまっていない
l2d = [['a', 'b'], ['c', 'd'], ['e', 'f']] ←タプルでもよい

>>> dict(l2d)
{'a': 'b', 'c': 'd', 'e': 'f'}
In [51]: x = list('ABC')
In [52]: y = list('123')
In [53]: z = list('abc')

In [54]: tuple_of_lists = x, y, z

In [56]: tuple_of_lists
Out[56]: (['A', 'B', 'C'], ['1', '2', '3'], ['a', 'b', 'c'])

In [57]: list_of_lists = [x, y, z]
In [58]: list_of_lists
Out[58]: [['A', 'B', 'C'], ['1', '2', '3'], ['a', 'b', 'c']]

In [59]: dict_of_lists = {'No1':x, 'No2':y, 'No3':z}
In [60]: dict_of_lists
Out[60]: {'No1': ['A', 'B', 'C'], 'No2': ['1', '2', '3'], 'No3': ['a', 'b', 'c']}

指定したキーに対応する要素を取得するには

langs = {'python':100, 'JavaScript':20, 'Swift':3, 'C':33}
langs['Swift']
 >> 3
  • しかしこれだとキーが存在しないときにエラーが出る

要素を取得する(エラーなし)

get(key[,default])

  • default:キーが存在しない場合のデフォルト値(省略した場合のデフォルトはNone)
  • キーが存在しない場合に返すデフォルト値を指定することができる
langs = {'python':100, 'JavaScript':20, 'Swift':3, 'C':33}
l = langs.get('Object-C') # 存在しないキーを指定してもエラーにならない
type(l) # その場合の戻り値はNone
>> <class 'NoneType'>

l = langs.get('Java', 0)

キーが存在しない場合に新たな値を挿入する

setdefault(key[,default])

  • getメソッドの代わりに、setdafaultメソッドを使用すると
    • キーが存在していた場合はその値を返し
    • 存在しなければキーにdefaultの値をセットし、その値を返す
customer = {'name':'山田太郎', 'pref':'東京都'}
age = customer.setdefault('age')
customer
>> {'name':'山田太郎', 'pref':'東京都', 'age': None}
# defult値をセット
height = customer.setdefault('height', 180)
customer
>> {'name':'山田太郎', 'pref':'東京都', 'age': None, 'height':180}

辞書に要素を追加する・値を変更する

  • 辞書はミュータブルなデータ型。指定したキーに対する値を代入することで値を変更できる
langs = {'python':100, 'JavaScript':20, 'Swift':3, 'C':33}
langs['Swift'] = 9
langs
>> {'python':100, 'JavaScript':20, 'Swift':9, 'C':33} # Swiftが9に変更された
  • 存在しないキーを指定して辞書に値を代入すると、新たなキーと値のペアが作成される
mydic = {}
mydic['name'] = '山田太郎'
mydic['age'] = 44
mydic
>> {'name': '山田太郎', 'age': 44}

辞書の要素数を取得する

len(s)

langs = {'python':100, 'JavaScript':20, 'Swift':3, 'C':33}
len(langs)
>> 3

辞書の内容を別の辞書で更新・連結するには

  • リストやタプルと異なり、辞書は「+」では連結できない

update(other_dic)

  • 辞書の要素に引数other_dicで指定した辞書の要素を加える
  • 既存のキーがある(重複した)場合は、値が上書きされる
d1 = {'yellow':'黄', 'red':'赤'}
d2 = {'blue':'青', 'green':'緑'}

d1.update(d2)

d1
>> {'yellow':'黄', 'red':'赤', 'blue':'青', 'green':'緑'}

update(key1=value1, key2=value2)

d1.update(white='白', puple='紫') # keyにはクォート不要

d1
>>  {'yellow':'黄', 'red':'赤', 'blue':'青', 'green':'緑', 'white':'白', 'puple':'紫'}

辞書の要素を削除

  • 4種類ある
  • del, pop, popitem, clear

del dic[key]

  • 存在しないキーの要素を削除するとエラーになる

pop(key[,default])

  • 存在しないキーの要素を削除してもエラーにならない
  • default:キーが存在しない場合に返す値。未設定だとKeyError例外が送出される
colors = {'yellow':'黄', 'red':'赤'}

colors.pop('red')
>> 赤

colors
>> {'yellow':'黄'}

colors.pop('blue', None) # defaultを設定すると存在しないキーでもエラーにならない

popitem()

  • 辞書の要素が空になるまでランダムに要素を取得して削除していく
langs = {'python':100, 'JavaScript':20, 'Swift':3}

while langs:
 print(langs.popitem())

実行結果:
('python', 100)
('JavaScript', 20)
('Swift', 3)

clear()

  • 辞書からすべての要素を削除する
  • 辞書は空の状態になる「{}」
langs.clear()
langs
>> {}

辞書に指定したキーの要素が存在するかを調べる

キー in 辞書

キー not in 辞書

colors = {'yellow':'黄', 'red':'赤'}

'yellow' in colors
>> True

'yellow' not in color
>> False

辞書のすべてのキーを取得する

dict.keys()

  • keys()の戻り値はリストの仲間であるdict_keysオブジェクト
color = {'red':'赤', 'blue':'青', 'green':'緑', 'white':'白'}

colors.keys()
>> dict_keys(['red', 'blue', 'green', 'white'])
  • dict_keysオブジェクトはイテレート可能
  • そのままfor文に渡せば値を1つずつ取り出せる
for k in colors.keys():
  print(k)

>>
red
blue
green
white
  • listコンストラクタに渡せばリストに変換できる
l = list(colors.keys())
l
>>['red', 'blue', 'green', 'white']

辞書のすべての値を取得するには

dict.values()

  • valuesメソッドの戻り値はイテレート可能なdict_valuesオブジェクト
colors.values()
>> dict_values(['赤', '青', '緑', '白'])

for v in color.values():
  print(v)
>>
赤
青
緑
白

辞書に値が存在するかを調べる

値 in 辞書

'緑' in colors.values()
>> True

辞書からすべてのキーと値のペアを取得する

dict.items()

  • 戻り値は、キーと値のペアをタプルとするdict_itemsオブジェクト
color = {'red':'赤', 'blue':'青', 'green':'緑', 'white':'白'}

colors.items()

>> dict_items([('red':'赤'), ('blue':'青'), ('green':'緑'), ('white':'白')])

dict_itemsオブジェクトはイテレート可能

for k, v in colors.items():
  print(k, v)

>> 
red 赤
blue 青
green 緑
white 白

値の最大値を求める

  • keys, values, itemsメソッドの戻り値はイテレート可能なオブジェクトなのでmax関数やmin関数に渡すことが出来る
  • itemsメソッドによりキーと値のペアを取り出し、key引数ではlambda式で辞書の値の最大値を求めるための基準の要素を設定している
langs = {'python':100, 'JavaScript':20, 'Swift':3}

maxlang = max(langs.items(), key=lambda l:l[1]) # [1]がよくわからない
print(maxlang)
>> ('python', 105)

値の大きい順に表示する

  • 同様にkeys, values, itemsメソッドに戻り値をsorted関数に渡してソートすることができる
sorted_langs = sorted(langs.items(), key=lambda l:l[1], reverse=True)

for l, v in sorted_langs:
  print(l, v)

>>
python 100
JavaScript 20
Swift 3