文系でも分かる!Pythonプログラミング - {class : dict} / keys( ) / values( ) / items( ) / update( ) / del
← preview
next →
< class 'dict' >
dictionary
>> dictionary ( ディクショナリー )
= 辞書。
皆さんは、PCやスマートフォンなどに装備されている
「ユーザー辞書」という機能を使ったことはありますか?
普通は「うわあ」と打ち込んでも
「上顎」「上あご」「ウワア」
...などとしか出ませんが、
「ユーザー辞書」を使うことによって
「うわあ」と打ち込んだ時に
「▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああ」という
文字列が表示されるようにすることができます。
「月咬(つきがみ)」という名前も変換では出てこないので、
「つき」と打ち込むことで
「月咬ライト」という文字列が
呼び出されるように設定しています。
また、「けいせん」と打ち込むことで
##===============================##
👆このような線が表示されるようにしています。
「辞書」とは、「単語(索引)」を使って
「意味」という長い文章を引き出すものですね。
「ユーザー辞書」では、
「キーワード」を使って
「通常変換では出てこない文字列」だったり
「打ち込むのが面倒な文字列」みたいな
「値」を引き出すことが出来ます。
プログラミングでも
それと全く同じ事をする事ができます。
その時に使うのが「dict型(のオブジェクト)」です。
dict_name = { key : value }
dict型オブジェクト(辞書)を作るときは、
dict_name = { key : value }
このように
「key(キー)」と「value(値)」を
ペアにする必要があります。
「 key : value 」👈 この状態でワンペアです。
そのペアを「{波括弧}」で括ってやることで、
dict型オブジェクトになります。
そして、
dict_name = { key① : value① , key② : value② }
ペアとペアはお馴染みの「カンマ( , )」で区切ります。
dict_name[key] = dict型オブジェクトの値の取り出し
a = {"name":"月咬ライト", "age":27}
print(a["name"]) # >>> 月咬ライト
print(a["age"]) # >>> 27
a = { "name" : "月咬ライト" , "age" : 27 }
key(キー)とvalue(値)のペアを設定しました。
辞書からvalue(値)を取り出すには、
key(キー)を使ってやる必要があります。
「 a["name"] 」「 a["age"] 」のように
「 dict_name[ key ] 」という記述をします。
もしリストやタプルのように、index番号を使って
「 a[0] 」という書き方をするとどうなるか...
「0」というkey(キー)がないので、エラーになります。
ちょっとややこしいのですが、
「0」を key(キー) に
設定している場合はエラーにはなりません。
a = {0:"月咬ライト", 1:27} # 「0」や「1」をkeyにしたよ
print(a[0]) # >>> 月咬ライト
print(a[1]) # >>> 27
dict_name.keys( )
keys( )メソッドでは
dict型オブジェクト 内の key を全て取得することができます。
name = {
"tanaka":"田中",
"sato":"佐藤",
"takahashi":"高橋",
"ito":"伊藤",
"suzuki":"鈴木"
}
print(name.keys())
# >>> dict_keys(['tanaka', 'sato', 'takahashi', 'ito', 'suzuki'])
key(キー)がリストに格納されていますね。
ちなみに、name.keys( ) の型は
print(type(name.keys())
# >>> <class 'dict_keys'>
< class 'dict_keys' > というものです。
dict_name.values( )
value(値)の一覧を取得するには、
values( )メソッドを使います。
name = {
"tanaka":"田中",
"sato":"佐藤",
"takahashi":"高橋",
"ito":"伊藤",
"suzuki":"鈴木"
}
print(name.values())
# >>> dict_values(['田中', '佐藤', '高橋', '伊藤', '鈴木'])
value(値)が全て出てきましたね。
name.values( ) の型は
print(type(name.values())
# >>> <class 'dict_values'>
< class 'dict_values' > です。
dict_name.items( )
>> item ( アイテム )
= アイテム。項目、品目。
keyとvalueのペア一覧を取得するには
items( )メソッドを使います。
name = {
"tanaka":"田中",
"sato":"佐藤",
"takahashi":"高橋",
"ito":"伊藤",
"suzuki":"鈴木"
}
print(name.items())
# >>> dict_items([('tanaka', '田中'), ('sato', '佐藤'), ('takahashi', '高橋'), ('ito', '伊藤'), ('suzuki', '鈴木')])
リストの中にタプルが入っているものが出てきましたね。
お察しかと思いますが、
name.items( ) の型は
print(type(name.items())
# >>> <class 'dict_items'>
< class 'dict_items' > です。
for k in dict_name.keys( ): / for v in dict_name.values( ):
dict型オブジェクト は [ iterable ] なので
for文で値を順番に取り出す事ができます。
しかし...
name = {
"tanaka":"田中",
"sato":"佐藤",
"takahashi":"高橋",
"ito":"伊藤",
"suzuki":"鈴木"
}
for i in name:
print(i)
# >>> tanaka
# >>> sato
# >>> takahashi
# >>> ito
# >>> suzuki
このように「name」と、辞書名だけ書くと
key(キー)しか取得することができません。
そこで、先程紹介した
keys( ), values( )メソッドを使います。
name = {
"tanaka":"田中",
"sato":"佐藤",
"takahashi":"高橋",
"ito":"伊藤",
"suzuki":"鈴木"
}
#----------------------------#
# key(キー)一覧を取得
for k in name.keys():
print(k)
# >>> tanaka
# >>> sato
# >>> takahashi
# >>> ito
# >>> suzuki
#----------------------------#
# value(値)一覧を取得
for v in name.values():
print(v)
# >>> 田中
# >>> 佐藤
# >>> 高橋
# >>> 伊藤
# >>> 鈴木
key一覧、あるいはvalue一覧を
取り出す事ができました。
for i in dict_name.items( ):
items( )メソッドを
for文で使うとどうなるでしょうか?
name = {
"tanaka":"田中",
"sato":"佐藤",
"takahashi":"高橋",
"ito":"伊藤",
"suzuki":"鈴木"
}
for i in name.items():
print(i)
# >>> ('tanaka', '田中')
# >>> ('sato', '佐藤')
# >>> ('takahashi', '高橋')
# >>> ('ito', '伊藤')
# >>> ('suzuki', '鈴木')
タプルが出力されました。
なぜリストではなく
タプルなのか分かりますか?
まあ、簡単ですよね。
('tanaka', '田中') 👈この順番を
('田中', 'tanaka') 👈このように入れ替えられたり
別の値に変更出来てしまうと困るからです。
さっきのユーザー辞書の話で言うと
key : 'うわあ'
value : '▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああ'
これの順番が変わってしまって
('▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああ', 'うわあ')
こうなってしまったら、
「▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああ」を打ち込んで
「うわあ」を呼び出すことになってしまう。
そういうアホみたいな事を未然に防ぐために、
後から値を変更できないタプル型になっているわけですね。
しかしタプルのままではちょっと不便です。
例えば、こんなふうにdict型で
電話帳を作ったとしましょう。
phone = {
"月咬ライト":09011111111,
"月咬コイト":09022222222,
"月咬ミライ":08033333333
}
そして、出力結果が下記の状態になるようにしたい時は
どんなコードを書いたらいいでしょうか?
name : 月咬ライト さん
phone_number : 09011111111
name : 月咬コイト さん
phone_number : 09022222222
name : 月咬ミライ さん
phone_number : 08033333333
ここで思い出して欲しい事があります。
for i in dict_name.items( ): では
keyとvalueのペアが格納されたタプル が
i に代入されているのだから、
i の部分に
複数(2つ)の変数を用意してやれば、
タプルをアンパック代入する事ができる
わけですよねえ???
2つの変数 k, v を用意し、
アンパック代入を使うことで、
keyとvalueを別々に扱うことが出来ました。
これはぜひ覚えておきたいところです。
dict型オブジェクトの値の追加、変更
dict型の値の追加はどうすればできるでしょうか。
ちなみにappend( )は
list型オブジェクト専用メソッドなので使えません。
さらにlist型と違って、
dict型どうしを「+」で連結させることもできません。
dic1 = {"key1":"value1", "key2":"value2"}
dic2 = {"key3":"value3"}
dic3 = dic1 + dic2 # TypeError!!
print(dic3)
dict型の値の追加 は少し特殊です。
dic = {"key1":"value1", "key2":"value2"}
dic["key3"] = "value3"
print(dic)
# >>> {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
👆これをご覧ください。
dict型はindex番号が使えない代わりに、
dic["key3"] = "value3" のように
辞書名[キー] = 値 の形で書いてやることで、
キーと値のペアを辞書に新規で追加する事ができます。
同じ手法で既にあるキーを指定すると、
値を変更することができます。
dic = {"key1":"value1", "key2":"value2"}
dic["key2"] = "value!!!!"
print(dic)
# >>> {'key1': 'value1', 'key2': 'value!!!!'}
この点は少し list型 と似ていますね。
l = ["A", "B", "C"]
l[2] = "X"
print(l)
# >>> ['A', 'B', 'X']
dict1 | dict2
Python3.9以降では、
「 | ( 論理和 : OR )」という演算子
(Macの場合 : shift + ¥キー )を使うことで、
dict型どうしを連結できるようになったそうです。
dic1 = {"key1":"value1", "key2":"value2"}
dic2 = {"key3":"value3", "key4":"value4"}
dic3 = dic1 | dic2
print(dic3)
# >>> {'key1':'value1', 'key2':'value2', 'key3':'value3', 'key4':'value4'}
key(キー)がカブっていると
エラーになってしまうようなので、
注意しましょう。
ちなみに、
Pythonistaの更新が2年以上前からないので、
Pythonista勢はこの恩恵にあやかることはできません。
がんばれ Ole Zorn。
何があったんや。どしたん、話聞こか?
update
>> update ( アップデート )
= 更新。
辞書の内容を色々更新するために
dic["key3"] = "value3"
dic["key4"] = "value4"
dic["key5"] = "value5"
このように
代入文を書いてもいいですけれど、
かなり面倒ですよね。
辞書型 には、update( ) という
メソッドが用意されています。
dic = {
"佐藤":"090-1111-1111",
"鈴木":"090-2222-2222"
}
dic.update(月咬 = "090-0000-0000")
print(dic)
# >>> {'佐藤': '090-1111-1111', '鈴木': '090-2222-2222', '月咬': '090-0000-0000'}
update( ) では
対象の辞書.update( key = value )
こんな書き方をします。
辞書に新しいペアが追加されていますね。
ここで注目したいのが、
key(キー)である「月咬」に
"引用符"が 付 い て い な い ところです。
これは、
print("文字列", end=" ") の時に紹介した
「キーワード引数」に相当します。
key(キー)が
日本語であろうとなんであろうと
update( )におけるキーワード引数には
"引用符"を つ け て は な り ま せ ん 。
ちょっと特殊ですよね。
しかし、
僕はこれを知った時こう思いました。
「これじゃあユーザーに入力を求める
input( ) が使えないのではないだろうか?」
と。
はい。その通りです。
キーワード引数 に input( ) のような
関数を適用することはできません。
でも大丈夫。
キーワード引数を
使わなきゃいいだけのことですから。
普通の引数として扱ってやればいいだけです。
dic = {
"佐藤":"090-1111-1111",
"鈴木":"090-2222-2222"
}
# ここで辞書を作ってやって
new_data = {str(input("名前 >>>")) : str(input("電話 >>>"))}
# ここで引数にする
dic.update(new_data)
print(dic)
※ 僕は念のため使ってますけど、
input( ) で入力した値は
全て str型 になるので
str型で問題ない時は
str( )を使わなくても問題ありません。
ちなみに、
佐藤さんの電話番号が
「090-1111-1111」から
「090-9999-9999」に変わって
新しい社員の高橋さんと田中さんが入ってきた
みたいな場合でも
dic = {
"佐藤":"090-1111-1111",
"鈴木":"090-2222-2222"
}
new_data = {
"佐藤":"090-9999-9999",
"高橋":"080-1234-1234",
"田中":"080-4321-4321"
}
dic.update(new_data)
print(dic)
# >>> {
# '佐藤': '090-9999-9999',
# '鈴木': '090-2222-2222',
# '高橋': '080-1234-1234',
# '田中': '080-4321-4321'
# }
このようにしてやればいいですね。
一度に複数の値をアップデートしてやりたい場合には
そのまま「new_data」の辞書に
続けてペアを追加していけばよいわけです。
でもそれじゃ
dic["佐藤"] = "090-9999-9999"
dic["高橋"] = "080-1234-1234"
dic["田中"] = "080-4321-4321"
こう書いた時の面倒臭さと
どっこいどっこいなので
先ほどのinput( )を使った記述を
繰り返しできるようにしてやりましょう。
dic = {
"佐藤":"090-1111-1111",
"鈴木":"090-2222-2222"
}
for i in range(10):
new_data = {str(input("名前 >>>")) : str(input("電話 >>>"))}
dic.update(new_data)
print(dic)
# >>> {
# '佐藤': '090-9999-9999',
# '鈴木': '090-2222-2222',
# '高橋': '080-1234-4321',
# '田中': '080-4321-4321',
# '村田': '090-XXXX-XXXX',
# '小島': '090-XXXX-XXXX',
# '武田': '090-XXXX-XXXX',
# '森川': '090-XXXX-XXXX',
# '伊藤': '090-XXXX-XXXX',
# 'ゴンザレス': '060-YYYY-YYYY',
# 'ジョンソン': '000-$$$$-$$$$'
# }
沢山のペアを追加することができました。
「new_data = ...」の代入文を
for文よりも前に書かないように注意してくださいね。
del文
>> delete (デリート)
= 削除。
ペアの削除の方法も気になるところでしょう。
別記事で各タイプのオブジェクトで使える関数(メソッド)
についてまとめようと思っているので
今回は「del文」だけ紹介したいと思います。
例えば、
ジョンソンとゴンザレスが
何らかの罪を犯して捕まってしまったので
電話帳から除名することになった時は...
dic = {
'佐藤': '090-9999-9999',
'鈴木': '090-2222-2222',
'高橋': '080-1234-4321',
'田中': '080-4321-4321',
'村田': '090-XXXX-XXXX',
'小島': '090-XXXX-XXXX',
'武田': '090-XXXX-XXXX',
'森川': '090-XXXX-XXXX',
'伊藤': '090-XXXX-XXXX',
'ゴンザレス': '060-YYYY-YYYY',
'ジョンソン': '000-$$$$-$$$$'
}
del dic["ジョンソン"],dic["ゴンザレス"]
print(dic)
# >>> {
# '佐藤': '090-9999-9999',
# '鈴木': '090-2222-2222',
# '高橋': '080-1234-4321',
# '田中': '080-4321-4321',
# '村田': '090-XXXX-XXXX',
# '小島': '090-XXXX-XXXX',
# '武田': '090-XXXX-XXXX',
# '森川': '090-XXXX-XXXX',
# '伊藤': '090-XXXX-XXXX'
# }
このようにして、
del dict_name[key1], dict_name[key2]
という記述をしてやります。
簡単ですね。
「 del 」というのは関数ではありません。
「 Ture 」「 False 」
「 import 」「 as 」「 from 」
「 pass 」「 for 」「 in 」
「 if 」「 elif 」「 else 」
「 is 」「 and 」「 or 」「 not 」...
みたいな 予約語(よやく-ご) のうちの1つです。
予約語を変数にすることは
禁止されています。
それで言ったら
既にPythonに組み込まれている関数名と、
この予約語違いが分からなくなりそうですが、
関数が引数を受け取って
何らかの処理をして、
結果(戻り値)を返す仕組みなのに対して
予約語ってのは、
その前後に書かれてることに対して
直接手を下すための命令文みたいなものなわけです。
( True/Falseなんかはまた別だろうけど )
PCへの命令の根幹を成す絶対的なワードなので、
その機能を変える事は絶対許されないのです。
次の記事へ。