WindowsによるPython入門 #07: 辞書

# はじめに

今回はデータ構造の型である辞書型と集合型と凍結集合型を解説します。

# YouTube動画

[]()

# 辞書型

辞書型は、キーと値のペアを表すデータ型で、以下の特徴を持ちます。
- 可変
- イテラブル

リテラルとして、{} で生成出来ます。
また、コンストラクタを使用しても作成出来ます。

```py
>>> {}  # 空の辞書
{}
>>> type(_)
<class 'dict'>
>>> {"a": 1, "b":2, "c":3}  # キーと値のペアで指定
{'a': 1, 'b': 2, 'c': 3}
>>> type(_)
<class 'dict'>
>>> dict([("a", 1), ("b", 2), ("c", 3)])  # タプルのリスト
{'a': 1, 'b': 2, 'c': 3}
>>> type(_)
<class 'dict'>
>>> dict(a=1, b=2, c="abc")  # キーワード引数で指定
{'a': 1, 'b': 2, 'c': 'abc'}
```

可変なので、データを追加や置換が出来ます。
また、in 演算子でキーの存在確認が出来ます。

```py
>>> d = {"a": 1, "b":2, "c":3}
>>> d["a"]  # 参照
1
>>> d["d"] = "abc"  # 追加
>>> d
{'a': 1, 'b': 2, 'c': 3, 'd': 'abc'}
>>> d["d"] = 4  # 置換
>>> d
{'a': 1, 'b': 2, 'c': 3, 'd': 4}
>>> d["e"]  # 存在しないキーを指定するとエラー
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 'e'
>>> d.get("e")  # get()ならキーがなければNoneが返る
>>> d.get("d")  # キーがあれば値を返す
4
>>> "d" in d  # in演算子でキーの存在確認が出来る
True
>>> "e" in d
False
>>> del d["c"]  # del文で要素を削除可能
>>> d
{'a': 1, 'b': 2, 'd': 4}
```

キーやアイテムの一覧が取得出来ます。

```py
>>> d = {"a": 1, "b":2, "c":3}
>>> d.keys()  # キーの一覧(ビュー)を取得
dict_keys(['a', 'b', 'c'])
>>> d.values()  # 値の一覧(ビュー)を取得
dict_values([1, 2, 3])
>>> d.items()  # キーと値のペアの一覧(ビュー)を取得
dict_items([('a', 1), ('b', 2), ('c', 3)])
```

## 辞書内包表記

以下の構文で辞書内包表記が使用出来ます。
{キー:値 for 変数 in イテラブル}

```py
>>> {al:num for al,num in [("a",1), ("b",2), ("c",3)]}
{'a': 1, 'b': 2, 'c': 3}
>>> type(_)
<class 'dict'>
>>> {al:i for i,al in enumerate("abc")}
{'a': 0, 'b': 1, 'c': 2}
```

## キーに出来るオブジェクト

辞書のキーとして、ハッシュ可能なオブジェクトがキーに出来ます。
通常、不変オブジェクトはハッシュ可能で、可変オブジェクトはハッシュ可能ではありません。

```py
>>> d = {}
>>> t = (1, 2, 3)
>>> l = [1, 2, 3]
>>> d[t] = 1  # タプルはキーに出来る
>>> d[l] = 2  # リストはキーに出来ない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
>>> hash(t)  # タプルはハッシュ可能(hashable)
529344067295497451
>>> hash(l)  # リストはハッシュ可能ではない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'
```

# 集合型

集合型は、ユニークなキーの集まりを表すデータ型で、以下の特徴を持ちます。
- 可変
- イテラブル

リテラルとして、{} で生成出来ます。
また、コンストラクタを使用しても作成出来ます。

```py
>>> {1, 2, 3}
{1, 2, 3}
>>> type(_)
<class 'set'>
>>> {"a", "a", "b", "c"}
{'b', 'a', 'c'}  # 重複したキーは保持出来ない
>>> type(_)
<class 'set'>
>>> set((1, 2, 3))
{1, 2, 3}
>>> set("abc")
{'b', 'a', 'c'}
>>> set()  # 空の集合
set()
```

要素の追加と削除と確認。

```py
>>> a = {1, 2, 3}
>>> a
{1, 2, 3}
>>> a.add(4)
>>> a
{1, 2, 3, 4}
>>> a.remove(3)
>>> a
{1, 2, 4}
>>> 2 in a
True
>>> len(a)
3
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}
>>> a & b  # 積集合
{2, 3}
>>> a | b  # 和集合
{1, 2, 3, 4}
>>> a - b  # 差集合
{1}
>>> a ^ b  # 対称差 (どちらか片方に含まれているが、両方には含まれていない要素の集合)
{1, 4}
>>> a < b  # 真部分集合 (集合Bが集合Aのすべての要素に加えて別の要素を持っていなければならない)
False
```

## 集合内包表記

以下の構文で、集合を作成出来ます。
{式 for 変数 in イテラブル}

```py
>>> {al for al in "abc"}
{'b', 'a', 'c'}
>>> type(_)
<class 'set'>
```

# 凍結集合型

凍結集合型は、集合型の不変版で、以下の特徴を持ちます。
- 不変
- イテラブル

リテラルは、ありませんので、コンストラクタを使用して作成出来ます。

```py
>>> f = frozenset({1, 2, 3})
>>> type(f)
<class 'frozenset'>
>>> f.add(4)  # 不変なので追加出来ない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'frozenset' object has no attribute 'add'
```

# おわりに

以上、辞書型と集合型と凍結集合型に関して解説しました。
次回は、制御文に関して解説します。