a

dict

dict: key:値

キーは重複不可で文字列・数値・タプル等のimmutableな値
要素に順序はない
{} でつくるのはsetと同じ
in での存在チェックや


初期化

metro = {
    "G": "銀座線",   # コメント
    "M": "丸ノ内線",
    "H": "日比谷線",
    "T": "東西線"
}
print(metro)
# {'G': '銀座線', 'M': '丸ノ内線', 'H': '日比谷線', 'T': '東西線'}

初期化 : dict(key:値, key:値,...)

  • タプルのリストを引数にして辞書を生成できる
data = dict([("yellow", 3), ("blue", 6), ("green", 5)])
print(data)
# {'yellow': 3, 'blue': 6, 'green': 5}
  • リストのタプルを引数にして辞書を生成できる

data = dict((["yellow", 3], ["blue", 6], ["green", 5]))
print(data)
# {'yellow': 3, 'blue': 6, 'green': 5}
  • キーワード引数で辞書を生成できる

data = dict(yellow = 3, blue = 6, green = 7)
print(data)
# {'yellow': 3, 'blue': 6, 'green': 7}  # キーが文字列になる

2つのリストからzipで辞書を作成

  • キーと値のペアは少ない方で合わせられる
  • キーの重複がある場合、後方優位
keys = ["yellow", "blue", "green", "blue", "red"]  # redはペアがない為、無視される
values = [3, 6, 5, 1]  # blueのペアは後方優位で1
data = dict(zip(keys, values))
print(data)
# {'yellow': 3, 'blue': 1, 'green': 5}

イテレータと値の初期値で辞書をつくる : dist.fromkeys(イテレータ, 初期値)

l = ["S", "M", "L"]
d = dict.fromkeys(l, 0)  # イテレータがkeyになる
print(d)
# {'S': 0, 'M': 0, 'L': 0}

d2 = dict.fromkeys(l)  # 初期値は省略可能
print(d2)
# {'S': None, 'M': None, 'L': None}
  • 同じ構造の辞書を作成
d = {'S': 1, 'M': 2, 'L': 3}
d2 = dict.fromkeys(d, 0)
print(d2)

要素の追加 : 辞書[キー] = 値

  • キーがあれば更新、無ければ追加
data = {"yellow" : 3, "blue" : 6, "green" : 5}
data["blue"] = 66  # 更新
print(data)
# {'yellow': 3, 'blue': 66, 'green': 5}
data["red"] = 22  # 追加
print(data)
# {'yellow': 3, 'blue': 66, 'green': 5, 'red': 22}

要素の追加(要素が無い時のみ) : setdefault(キー, 値)

data = {"yellow" : 3, "blue" : 6, "green" : 5}
a = data.setdefault("blue", 66)
print(a)  # ある時は既存の値を返す
# 6
print(data)  # ある時は更新されない
# {'yellow': 3, 'blue': 6, 'green': 5}
b = data.setdefault("white", 13)
print(b)  # 無い時はセットする値を返す
# 13
print(data)  # ある時は更新される
# {'yellow': 3, 'blue': 6, 'green': 5, 'white': 13}

要素の取得

  • キーで値を取得(リスト、タプルと同じ)
d = {'S': 1, 'M': 2, 'L': 3}
try :
    print(d["M"])  # キーがないとエラーになる
# 2
except KeyError:
    print("error")
  • キーで値を取得 : get(キー)
d = {'S': 1, 'M': 2, 'L': 3}
print(d.get("LL"))  # get()はなくてもエラーにならない
# None
  • キーをリストで取得
d = {'S': 1, 'M': 2, 'L': 3}
l = list(d.keys())
print(l)
# ['S', 'M', 'L']
  • 値をリストで取得
d = {'S': 1, 'M': 2, 'L': 3}
l = list(d.values())
print(l)
# [1, 2, 3]
  • 要素(キー、値)をリストで取得
d = {'S': 1, 'M': 2, 'L': 3}
l = d.items()
print(l)
# dict_items([('S', 1), ('M', 2), ('L', 3)])
for key, value in d.items():  # 要素をループで回す
    print(key, "&", value)
# S & 1
# M & 2
# L & 3

他の辞書で更新 : update(辞書)

  • 重複キーは無視、値は後方優位
data = {"yellow" : 3, "blue" : 6, "green" : 5}
data2 = {"blue" : 16, "red" : 10}
data.update(data2)
print(data)
# {'yellow': 3, 'blue': 16, 'green': 5, 'red': 10}

要素の削除

  • キーを指定削除
data = {"yellow" : 3, "blue" : 6, "green" : 5, "red" : 9}
del data["blue"]
print(data)
# {'yellow': 3, 'green': 5, 'red': 9}
  • 全ての要素を削除
data.clear()
print(data)
# {}

pop(キー)

d = {'S': 1, 'M': 2, 'L': 3}
a = d.pop("S")
print(a)
# 1
print(d)
# {'M': 2, 'L': 3}

辞書内包表記 : {キー:値 for キー in イテラブル}

from random import randint
data = ["yellow", "blue", "green", "red"]
d = {key : randint(1,100) for key in data}
print(d)
# {'yellow': 53, 'blue': 68, 'green': 47, 'red': 7}