Pythonの組み込みデータ構造

Pythonには４つの組み込みデータ構造があります。
1. リスト
2. 辞書
3. 集合
4. タプル

これらについて簡単にまとめます。もし誤り等あればご指摘いただけると幸いです。
*（より正確かつ詳しい内容は[Python公式ドキュメント](https://docs.python.jp/3/tutorial/datastructures.html)を参照してください。）*

## リスト
リストは**「オブジェクトの順序付き可変コレクション」**です。
順序付きというのは、リスト内の各データに**インデックスがついている**ということ、
可変というのは、**拡張や縮小ができる**ということです。

### 基本的な操作
作成：`data = []`、`list()`
データ入力：`data = [1, 2, 3]`
データ出力：`data[index]`
拡張：`data.append()`、`data.insert()`、`data.extend()`
縮小：`data.remove()`、`data.pop()`
削除：`data.clear()`

```
>>> alphabet = ['a', 'b', 'c']    # リストを定義

>>> type(alphabet)    # 型を確認
<class 'list'>

>>> alphabet.append('e')    # alphabetの要素に'e'を追加
>>> alphabet
['a', 'b', 'c', 'e']

>>> alphabet.insert(3, 'd')    # インデックス3の位置に'd'を追加
>>> alphabet
['a', 'b', 'c', 'd', 'e']

>>> alphabet.pop()    # リストの末尾の要素を削除して返す
'e'
>>> alphabet
['a', 'b', 'c', 'd']
```

## 辞書
辞書は**「キーと値のペアの順序なし可変コレクション」**です。
**キーは辞書内で一意**であり、順序はありません。

### 基本的な操作
作成：`data = {}`、`dict()`
データ入力：`data = {key1:value1, key2:value2, key3:value3}`
データ入力：`data = dict(key1=value1, key2=value2, key3=value3)`
データ出力：`data[key]`
拡張：`data[key] = value`、`data.setdefault(key, value)`
縮小：`data.pop(key)`、`data.popitem()`
削除：`data.clear()`

```

>>> fruits = {'apple':100, 'banana':120, 'cherry':200}    # 辞書を定義

>>> type(fruits)    # 型を確認
<class 'dict'>

>>> fruits['apple']    # キーが'apple'の値を返す
100

>>> fruits['durian'] = 300    # キーが'durian'、値が300のペアを追加
>>> fruits
{'apple': 100, 'banana': 120, 'cherry': 200, 'durian': 300}

>>> fruits.setdefault('fig', 500)    # キーが'fig'、値が500のペアを追加し、その値を返す
500
>>> fruits
{'apple': 100, 'banana': 120, 'cherry': 200, 'durian': 300, 'fig': 500}

>>> fruits.setdefault('banana', 150)    # setdefaultメソッドで指定したキーが既にある場合は変更や追加はせず、指定したキーの値を返す
120
>>> fruits
{'apple': 100, 'banana': 120, 'cherry': 200, 'durian': 300, 'fig': 500}

>>> fruits.pop('cherry')    # キーが'cherry'のキーと値のペアを削除し、その値を返す
200
>>> fruits
{'apple': 100, 'banana': 120, 'durian': 300, 'fig': 500}

>>> fruits.items()    # 辞書のキーと値のペアを返す。ループ処理でよく使う。
dict_items([('apple', 100), ('banana', 120), ('durian', 300), ('fig', 500)])

>>> sorted(fruits.values())    # 辞書の値をソートして返す
[100, 120, 300, 500]
```

## 集合
集合は**「重複のないオブジェクトの順序なし可変コレクション」**です。
重複のないとはその言葉通り、**重複値を禁止**しています。
集合の和、積、差などの**数学的な演算が可能**です。
検索が主な目的である場合は、集合の方がリストに比べて**高速**です。

### 基本的な操作
作成：`data = set()`
データ入力：`data = {'a', 'b', 'c'}`
拡張：`data.add()`
縮小：`data.remove()`、`data.pop()`
削除：`data.clear()`

```
>>> vowels = set('aeeiiioooouuuuu')    # set関数で集合を定義
>>> vowels
{'i', 'e', 'u', 'o', 'a'}

>>> type(vowels)     # 型を確認
<class 'set'>
 
>>> word = 'python'
>>> u = vowels.union(set(word))    # 集合vowelsとwordを集合にしたものとの和集合を取る
>>> u
{'n', 'i', 't', 'e', 'u', 'y', 'o', 'h', 'p', 'a'}

>>> sorted(u)    # ソートして返すことも可能
['a', 'e', 'h', 'i', 'n', 'o', 'p', 't', 'u', 'y']

>>> d = vowels.difference(set(word))    # 集合vowelsとwordを集合にしたものとの差集合を取る
>>> d
{'i', 'u', 'a', 'e'}

>>> i = vowels.intersection(set(word))    # 集合vowelsとwordを集合にしたものとの積集合を取る
>>> i
{'o'}
```

## タプル
タプルは**「オブジェクトの順序付き不変コレクション」**です。
一度タプルにオブジェクトを割り当てたら、そのタプルは**変更できません**。
オブジェクトを自分（や他の人）が書いたコードで変更できないようにしたい場合に使います。

### 基本的な操作
作成：`data = ()`、`tuple()`
データ入力：`data = ('a', 'e', 'i', 'o', 'u')`
データ出力：`data[index]`
削除：`del data`

```
>>> vowels = ('a', 'e', 'i', 'o', 'u')    # タプルを定義（母音のデータなど、変更が起こりえないものはタプルが適している）
>>> vowels
('a', 'e', 'i', 'o', 'u')

>>> type(vowels)    # 型を確認
<class 'tuple'>

>>> vowels[2]
'i'
 
>>> t = ('Python',)    # 要素が１つだけのタプルを定義する場合は最後にカンマが必要
>>> type(t)
<class 'tuple'>
>>> t
('Python',)

>>> t2 = ('Python')    # カンマがないと文字列として定義される
>>> type(t)
<class 'str'>
>>> t
'Python'
```

## その他
Pythonは上記のデータ構造を組み合わせた**複合データ構造**も扱えます。
例えば「リストの集合」や「辞書のタプル」などです。
以下に「辞書を含む辞書」の例を示します。

```
>>> score = {}
>>> score['Alice'] = {'math':80, 'science':90, 'history':70}
>>> score
{'Alice': {'math': 80, 'science': 90, 'history': 70}}
```

## 参考文献
- [Python公式ドキュメント](https://docs.python.jp/3/index.html)
- [Head First Python 第2版](https://www.oreilly.co.jp/books/9784873118291/)