Python はじめから勉強 Hour6：よく使うデータ型：タプル型・セット型・辞書型

# Python はじめから勉強 Hour6：よく使うデータ型：タプル型・セット型・辞書型

* Pythonで何かしようとしたときに、まずサンプルスクリプトを探してなんとなく実行してた私が、
* 自動実行でREST API叩いて、結果の確認、VM操作までやってみたいと思う7時間
* よく使うデータ型についての理解。「タプル型」「セット型」「辞書型」をやります



## 学習資料

* たった 1日で基本が身に付く！ Python超入門 
  * https://a.r10.to/hbHMiv



## 過去の投稿

* [Python はじめから勉強 Hour1：Hello World](https://qiita.com/matsumo2019/items/5a69381f44456e6e6a5d)
* [Python はじめから勉強 Hour2：制御文](https://qiita.com/matsumo2019/items/6daa862fd34c8929fb65)
* [Python はじめから勉強 Hour3：関数](https://qiita.com/matsumo2019/items/6c63c737c27e51000f79)
* [Python はじめから勉強 Hour4：オブジェクト指向①](https://qiita.com/matsumo2019/items/b4e083b804590fcdf0d1)
* [Python はじめから勉強 Hour5：オブジェクト指向②](https://qiita.com/matsumo2019/items/5d429147ae44d81a69da)



## 環境

* Windows
* Python Ver3系



## タプル型

* **タプル**は複数のデータをまとめて管理するための型です。そういう意味ではリストと似ています。
* リストは一般的に「同種類のデータ」を任意の数で格納することに用いられます。
* タプルは複数の異なる種類のデータをまとめる目的で使われます。



* 例えば生徒の「名前」「身長」「体重」の組み合わせを管理したいとき。その中で平均身長を求めるとき。これをリストで表すと下記のようになります。

```python
taro = ['taro', 170, 80]
jiro = ['jiro', 180, 85]
saburo = ['saburo', 172, 81]
class_list = [taro, jiro, saburo]

sum_height=0

for person in class_list:
	sum_height += person[1]

print(sum_height/len(class_list))
```

 * 実行結果

```python
174.0
```

 * 結果は出ましたが、リストは本来「**同種のデータを任意の数で格納する**」目的のため本来の使い方と異なる（ようです）
 * こういったカチットしたデータ構造を扱うには**タプル**を使いましょう
 * 先ほどのスクリプトをタプルを使ってみましょう。※最初の3行だけ異なることに注意

```python
taro = ('taro', 170, 80)
jiro =('jiro', 180, 85)
saburo = ('saburo', 172, 81)
class_list = [taro, jiro, saburo]

sum_height=0

for person in class_list:
	sum_height += person[1]

print(sum_height/len(class_list))
```

 * 実行結果

```python
174.0
```

 * 結果は当然同じです。
 * タプルは宣言や要素の参照の仕方と言う点でリストと似ていますが、実体はかなり違います。
 * リストは要素の追加や削除、変更が可能ですが、タプルは一度作った後は参照しかできない不変オブジェクトとなります。



* タプルの使い方をもう少し見てみます
* リストのように扱えるが、変更や削除ができないことが分かると思います。

```python
>>> taro = ('taro', 180, 80)	# ()を使ってタプル型を宣言します。
>>> type(taro)				   # tuple型であることを確認
<class 'tuple'>
>>> print(taro[1]) 			   #リストと同じように参照できます。
180

>>> taro[0] = 'jiro'			# tuple型は値の変更ができない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>>
>>> del taro[1]                 # tuple型は値の削除もできない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion
```



## タプル型の扱い方・関数

### アンパック代入

* タプルでよく使われるテクニックとして「タプル型 = タプル型」という表記で右側のタプルの中身を個別に取り出す「**アンパック代入**」という方法があります。タプルの要素を分かりやすい変数名にする目的です

```python
>>> (name, height, weight) = ('taro', 180, 80)
>>> print(name)					# データが扱いやすくなりました
taro
>>> print(weight)
80
>>>
```



### enumerate()関数

* 引数に指定したリストを「インデックス蛮行」と「要素」が**タプル**になって入ってきます。

```python
>>> my_list = ['a', 'b', 'c', 'd']
>>> enum_obj = enumerate(my_list)
>>> print(enum_obj)
>>> print(list(enum_obj))
[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd')]

```

* enumerate関数を使うとリストをインデックス番号付きでループさせることが簡単にできます。
* （いまいち何に使うか分からん）

* 例えばこんな使い方

```python
list1 = ['a', 'b', 'c']
for (index, item) in enumerate(list1):
	print('{}:{}'.format(index, item))
```

* 実行結果

```python
0:a
1:b
2:c
```

* わざわざインデックス用の変数を宣言したり、ループを回るごとに1加算させたりする必要がなくなります。



## セット型

* セットは順序と重複のないデータ構造です。数学の「集合」のイメージですね。
* なんとなく概念↓

| セット   | データ                     |
| -------- | -------------------------- |
| くだもの | りんご<br>ばなな<br>いちご |

* 例えば上記のような集合があった場合に、「ぐれーぷ」というデータは追加できますが「りんご」というデータは重複しているために追加されません。
* セットは検索が非常に高速らしい
* 使い方確認

```python
>>> my_set = set()
>>>
>>> my_set.add('apple')		# appleを追加
>>> print(my_set)
{'apple'}
>>>
>>> my_set.add('banana')	# bananaを追加
>>> print(my_set)
{'banana', 'apple'}
>>>
>>> my_set.add('apple')		# appleを追加する。追加されない、エラーにもならない
>>> print(my_set)
{'banana', 'apple'}
>>>
```





## 辞書型

* 辞書型はセット型の発展系です。
* キーと値を持っています。
* こんなイメージ↓

| セット   | データ                                         |
| -------- | ---------------------------------------------- |
| くだもの | りんご：あか<br>ばなな：きいろ<br>いちご：あか |

* セットと同じ感じですが各キーには値を持っています
* 使い方確認

```python
>>> fruits_dict = dict()
>>> fruits_dict['apple'] = 'red'		# キーと値を入れる
>>>
>>> fruits_dict['banana'] = 'yellow'
>>> fruits_dict
{'apple': 'red', 'banana': 'yellow'}
>>> fruits_dict['apple']				# キーから値を取り出す
'red'
>>>
```





## 今回のまとめ

* よく使うデータ型を確認しました。

* 辞書型が扱えるとJSON形式を取り込んだり、吐き出したりできそうです

  

## 名言・ライトニングトーク用

* 使い方は分かってきたけど、何かを作るには程遠いような。。。。。。
* Qiita炎上中。。。。。