見出し画像

文系でも分かる!Pythonプログラミング - {class : dict} / keys( ) / values( ) / items( ) / update( ) / del

← preview

next →

< class 'dict' >

dictionary.

dictionary

>> dictionary ( ディクショナリー ) 
= 辞書。

皆さんは、PCやスマートフォンなどに装備されている
ユーザー辞書」という機能を使ったことはありますか?

ユーザー辞書

普通は「うわあ」と打ち込んでも
「上顎」「上あご」「ウワア」
...などとしか出ませんが、

ユーザー辞書」を使うことによって

「うわあ」と打ち込んだ時に
「▂▅▇█▓▒░(’ω’)░▒▓█▇▅▂うわあああああああ」という
文字列が表示されるようにすることができます。

これって元ネタなんだったんだっけ。

「月咬(つきがみ)」という名前も変換では出てこないので、
「つき」と打ち込むことで
「月咬ライト」という文字列が
呼び出されるように設定しています。

また、「けいせん」と打ち込むことで

##===============================##

👆このような線が表示されるようにしています。

辞書」とは、「単語(索引)」を使って
意味」という長い文章を引き出すものですね。

「ユーザー辞書」では、
キーワード」を使って
「通常変換では出てこない文字列」だったり
「打ち込むのが面倒な文字列」みたいな
」を引き出すことが出来ます。

プログラミングでも
それと全く同じ事をする事ができます。

その時に使うのが「dict型(のオブジェクト)」です。


dict_name = { key : value }

{ 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] 」という書き方をするとどうなるか...

KeyError : 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


ここで思い出して欲しい事があります。

リストの「 [ ブラケット ] 」と違って
タプルの「 ( 括弧 ) 」は省略することができます。

何気に大切なことかもしれない。
https://note.com/plasma_network/n/n73d2df02e3cc
〔 unpack ( アンパック ) 〕

リストやタプルに格納されている要素たちを、
要素と同じ数の変数に1つ1つ代入することができます。

これを「アンパック代入」と言います。
https://note.com/plasma_network/n/n73d2df02e3cc
アンパック代入

for i in dict_name.items( ): では

keyvalueペアが格納されたタプル 
i に代入されている
のだから、

の部分に
複数(2つ)の変数を用意してやれば、
タプルをアンパック代入する事ができる

わけですよねえ???

for k,v in ○○.items( ):

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)
TypeError : 
unsupported operand type(s) for + : 'dict' and 'dict'

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への命令の根幹を成す絶対的なワードなので、
その機能を変える事は絶対許されないのです。


次の記事へ。

いいなと思ったら応援しよう!