毎日ちょっとPython ~ 8日目 ~

今日は辞書型。二日連続。

辞書型

辞書のインデックスには様々なデータ型を用いることができる。
※JSのオブジェクトみたいな感じかな

>>> my_cat = {'size':'fat','color':'gray','disposition':'loud'}
>>> my_cat['size']
'fat'
>>> 'My cat has ' + my_cat['color'] + ' fur.'
'My cat has gray fur.'

辞書は順序関係がありません。これが、非常に強力な手段です(便利よねぇ)
※辞書に存在していないキーを使ってアクセスするとKeyErrorというエラーが出ます。

birthdays = {'アリス':'4/1','ボブ':'12/12','キャロル':'4/4'}

while True:
   print('名前を入力してください:(終了するにはEnterだけ押してください)')
   name = input()
   if name == '':
       break

   if name in birthdays:
       print(name + 'の誕生日は' + birthdays[name])
   else: 
       print(name + 'の誕生日は未登録です')
       print('誕生日を入力してください:')
       bday = input()
       birthdays[name] = bday
       print('誕生日データベースを更新しました。')
   

というような感じのプログラムが用意されてました。結果はこんな感じ

名前を入力してください:(終了するにはEnterだけ押してください)
sk3
sk3の誕生日は未登録です
誕生日を入力してください:
5/8
誕生日データベースを更新しました。
名前を入力してください:(終了するにはEnterだけ押してください)
アリス
アリスの誕生日は4/1
名前を入力してください:(終了するにはEnterだけ押してください)

まぁこれはあくまでプログラムで先に辞書型を定義しているだけなので終わったら消えちゃいますけど。

keys(),values(),items()

辞書にはリスト風の値を返すものが三つ。実際に見てみましょう。
(dict_keys,dict_values,dict_items というデータ型名らしい)

spam = {'color':'red','age':42}

# values()
for v in spam.values():
   print(v)

# keys()
for k in spam.keys():
   print(k)

# items()
for i in spam.items():
   print(i)

という感じで、書くとそれぞれの値とかキーとかを取得できます

red
42
color
age
('color', 'red')
('age', 42)

itemsは二つで受け取ることが可能です。

spam = {'color':'red','age':42}
for k,v in spam.items():
   print('Key:' + k + ' Value: ' + str(v))

Key:color Value: red
Key:age Value: 42

という形で値を取得することができます

キーや値が存在するかの判定方法

こんな感じで調べられます

>>> spam = {'name':'SK3','age':7}
>>> 'name' in spam.keys()
True
>>> 'SK3' in spam.values()
True
>>> 'color' in spam.keys()
False
>>> 'color' not in spam.keys()
True
>>> 'color' in spam
False

get()メソッド

いちいちキーが存在するかどうかを判定するのは面倒(Errorがかえってくるから)なので、辞書のget()メソッドを用いて楽ができます

一つ目の引数がキー名
二つ目の引数がもし何もなかった時に返す値

>>> picnic_items = {'apples': 5,'cups':2}
>>> 'I am bringing ' + str(picnic_items.get('cups',0)) + 'cups'
'I am bringing 2cups'
>>> 'I am bringing ' + str(picnic_items.get('eggs',0)) + 'cups'
'I am bringing 0cups'

こんな感じでいけます。
もしget()を使わないと、次の例のようにエラーになってしまう。

>>> picnic_items = {'apples': 5,'cups':2}
>>> 'I am bringing ' + str(picnic_items['eggs']) + 'cups'
Traceback (most recent call last):
 File "<pyshell#44>", line 1, in <module>
   'I am bringing ' + str(picnic_items['eggs']) + 'cups'
KeyError: 'eggs'

setdefault()メソッド

辞書にキーが未登録の場合のみ値を登録したいという事がよくあります。コードで書けば次のような感じ

spam = {'name':'Pooka','age':5}
if 'color' not in spam:
   spam['color'] = 'black'

setdefault()を使うとこれを一行でできます。

>>> spam = {'name':'Pooka','age':5}
>>> spam.setdefault('color','black')
'black'
>>> spam.setdefault('color','white')
'black'
>>> spam
{'name': 'Pooka', 'age': 5, 'color': 'black'}

はじめてsetdefault()を使ったときは、存在しないので color:black を登録します。

次に実行したときにはすでにcolorは存在するのでwhiteは登録されず、blackが登録されます。

キーが確実に存在するようにするための便利な近道です。こんなプログラムを書いてみました。

message = 'It was a bright cold day in April, and the clocks were striking thirteen.'
count = {}

for character in message:
   count.setdefault(character,0)
   count[character] = count[character] + 1

print(count)

実行結果はこんな感じ

{'I': 1, 't': 6, ' ': 13, 'w': 2, 'a': 4, 's': 3, 'b': 1, 'r': 5, 'i': 6, 'g': 2, 'h': 3, 'c': 3, 'o': 2, 'l': 3, 'd': 3, 'y': 1, 'n': 4, 'A': 1, 'p': 1, ',': 1, 'e': 5, 'k': 2, '.': 1}

文字列中の各文字をループで調べて、文字が何回現れたかを数えるプログラムです。
setdefaultで先に値を入れ込むことで、以降の count[character] = count[character] + 1 でエラーがでないようになっています。

最後に

辞書もべんりだなぁ。どっちをよく使うんだろう...

この記事が気に入ったらサポートをしてみませんか?