キーと値からなるデータ型、辞書型の操作を解説します。
辞書型のデータについて
辞書型はキーと値のペアからなるデータです。
dict1 = {"apple": 100, "orange": 200, "banana": 300}
キーはappleで値は100です。
辞書のように項目apple(キー)とその意味(値)の関係に似ているので辞書型・dict型と呼ばれます。
辞書型の決まりは
- 辞書型は{}で囲う
- キー : 値 のようにコロン:で区切る
- キーはハッシュ値として扱われるので、重複しない
辞書型では重複してはいけないので、下記のような辞書データを表示すると重複は上書きされます。
dict2ではappleが重複していますが、printすると最初のapple:100のデータがあとのapple:200に上書きされて消えています。
# 辞書型の定義
dict1 = {"apple": 100, "orange": 200, "banana": 300}
dict2 = {"apple": 100, "apple": 200, "banana": 300}
# 辞書型の要素の取得
print(dict1) # {'apple': 100, 'orange': 200, 'banana': 300}
print(dict2) # {"apple": 200, "banana": 300}
---実行結果---
{'apple': 100, 'orange': 200, 'banana': 300}
{'apple': 200, 'banana': 300}
辞書型のデータの取り出す方法
dict全体を表示
# 全体を表示
print(dict1) # {'apple': 100, 'orange': 200, 'banana': 300}
キー名を指定して値を取得
print(dict1["apple"]) # 100
print(dict1["orange"]) # 200
print(dict1["banana"]) # 300
#getを使っても書ける
print(dict1.get("apple")) # 100
print(dict1.get("orange")) # 200
print(dict1.get("banana")) # 300
キー名を取得
keysメソッドを使う
#dictのキーを取得する
print(dict1.keys()) # dict_keys(['apple', 'orange', 'banana'])
#dictのキーをリストとして取得
print(list(dict1.keys())) # ['apple', 'orange', 'banana']
値のみを取得
#dict1の値のみを取得する
print(dict1.values()) # dict_values([100, 200, 300])
#リストとして取得
print(list(dict1.values())) # [100, 200, 300]
#for文でdictの値を取得する
for i in dict1.values():
print(i) # 100, 200, 300
キーと値をfor文を使って両方取得
# for文でdictのキーと値を取得する
for k, v in dict1.items():
print(k, v) # apple 100, orange 200, banana 300
print(k) # apple, orange, banana
print(v) # 100, 200, 300
print(f'{k}は{v}円です') # appleは100円です, orangeは200円です, bananaは300円です
キー名が存在するか確認
#appleが存在するかどうかを確認する
print("apple" in dict1) # True
dictを使った演算
平均値を出す
#平均値を求める
print(sum(dict1.values()) / len(dict1.values())) # 600 / 3 = 200, lenは要素の数を返す
最大値・最小値を出す
#最大値のキーを取得する
print(max(dict1)) # orange maxだけだとキーの最大値を返す(a,b,oの順?)
print(max(dict1.keys())) # orange (上と同じ)
print(max(dict1.values())) # 300 (valuesで値を指定すると値の最大値を返す)
print(max(dict1, key=dict1.get)) # keyにdict1.getを指定すると最大値のキーbananaが返ってくる
print(max(dict1, key=len)) #key引数にlenを指定すると、キーの長さの最大値を返すが、bananaは出て来ない
#最大値が重複する場合に全て列挙する
#重複するキーをすべて取得する
print([k for k, v in dict1.items() if v == max(dict1.values())]) # ['banana']
#最長の文字列のキーを全て取得する
print([k for k, v in dict1.items() if len(k) == max(len(k) for k in dict1)]) #['orange', 'banana']
重複する全要素を取得する場合は実行結果をリストで返すためにリスト内包表記で書く
上記はifで条件分岐してdictの最大値の要素を取得してリストを返すように書いている。
dictの更新
dictも新しい要素を追加したり削除できるが、キーは重複できない
要素の追加
手動で要素を追加
#新しいキーを追加する
dict1["grape"] = 400 # grape:400を追加する
print(dict1)
---実行結果---
{'apple': 100, 'orange': 200, 'banana': 300, 'grape': 400}
別のdictを追加する
#dict1にdict2を追加する
dict1.update(dict2)
print(dict1)
---実行結果---
{'apple': 100, 'orange': 200, 'banana': 300, 'grape': 400, 'peach': 500, 'melon': 600}
#dict3を定義
dict3 = {"apple": 1000, "orange": 2000, "banana": 3000, "grape": 4000, "peach": 5000, "melon": 6000}
# dict1にdict3を追加する
dict1.update(dict3)
print(dict1) #キーが重複している場合は、dict3の値が優先される
---実行結果---
{ 'apple': 1000, 'orange': 2000, 'banana': 3000, 'grape': 4000, 'peach': 5000, 'melon': 6000}
要素の更新
print(dict1)
dict1["grape"] = 500 # grapeの値を500に変更する
print(dict1)
---実行結果---
{'apple': 1000, 'orange': 2000, 'banana': 3000, 'grape': 4000, 'peach': 5000, 'melon': 6000}
{'apple': 1000, 'orange': 2000, 'banana': 3000, 'grape': 500, 'peach': 5000, 'melon': 6000}
値に対して加算することもできる
dict1["grape"] += 100 # grapeの値を100増やす 500 + 100 = 600
要素の削除
#キーを削除する
del dict1["grape"]
print(dict1) #grape : 500を消す
---実行結果---
{'apple': 1000, 'orange': 2000, 'banana': 3000, 'peach': 5000, 'melon': 6000}
for文で全部削除
#dict3のキーを削除する
print(dict3)
for k in list(dict3.keys()):
del dict3[k]
print(dict3) # {}
---実行結果---
{'apple': 1000, 'orange': 2000, 'banana': 3000, 'grape': 4000, 'peach': 5000, 'melon': 6000}
{}
clearで全部削除できる
#dict3のキーをclearで削除する
print(dict3)
dict3.clear()
print(dict3)
---実行結果---
{'apple': 1000, 'orange': 2000, 'banana': 3000, 'grape': 4000, 'peach': 5000, 'melon': 6000}
{}
他のdictに含まれるキーを削除する
#dict2のキーをdict1から削除する
print(dict1)
print(dict2)
for k in dict2.keys():
del dict1[k]
print(dict1)
---実行結果---
{'apple': 1000, 'orange': 2000, 'banana': 3000, 'grape': 600, 'peach': 5000, 'melon': 6000}
{'peach': 500, 'melon': 600}
{'apple': 1000, 'orange': 2000, 'banana': 3000, 'grape': 600} →dict1からdict2のpeach, melonが消えてる