pythonのlist/tuple/dict

#　はじめに
pythonの基礎として、リスト、タプル、辞書についての基礎を記載していきます。
setについては？rangeは?numpyについては？リストを語るのに内包表記は？というのは一旦置いておきます。


#　リスト

リストの作成。カンマで区切ったデータを[]でくくることで作成する。
list()で引数にiterableなオブジェクト（文字列やタプル）を取ることでも作れる。
[index]を指定することでvalueを呼び出せる。※後ろからも数えて指定することもできる。
index(value)でindexを表示させることができる。
またcount(value)では頻度を表示させられる。


```python
>>> a = ["2017","2018","2019"]
>>> a[0]
'2017'
>>> a[1]
'2018'
>>> a[2]
'2019'
>>> a[-1]
'2019'
>>> a.index("2019")
2
>>> a.count("2018")
1
```
リストはint型、float型、str型、変数、などなんでも入れることができる。
リストなどのシーケンスオブジェクトの中では「：」を使うことでスライス表記することができる。

```python
>>> b ="2016"
>>> c = [175.5, 1985, b ,"hello","world"]
>>> c[1:4]
[1985, '2016', 'hello']
```

リストは簡単に拡張することができる。
スライス表記はstep(何個飛びかも指定できる)。

```python
>>> d=a+c
>>> d
['2017', '2018', '2019', 175.5, 1985, '2016', 'hello', 'world']

#index0~index7を2間隔でスライスを作る
>>> d[0:7:2]
['2017', '2019', 1985, 'hello']
```
拡張に関しては以下でもできる。
※変数に代入しても戻り値がない為、Noneが返ってくる。

```python
a.extend(b)
```

len（）で要素を数えることができる

```python
>>> len(c)
5
```
reverse()で反転がてき、sort()で昇順降順も簡単に変えられる。
※sort()はインプレース演算 (in place、元のデータを演算結果で置き換えるやりかた) です。こちら[参照](https://note.nkmk.me/python-list-sort-sorted/)


```python
>>> a.reverse()
>>> a
['2019', '2018', '2017']
>>> a.sort()
>>> a
['2017', '2018', '2019']
>>> a.sort(reverse=true)
>>> a
['2019', '2018', '2017']
```

clear()を使うと要素を削除できます。del list[:] でも可能です。

```python
>>> a.clear()
>>> a
[]

#これでも同じことができます。
>>> del a[:]
>>> a
[]
```





#　タプル

比較できるように、listとtupleを作成。
[]で囲われているのがリスト
()で囲われているのがタプル


```python
>>> a = [2017,2018,2019]
>>> b = (2017,2018,2019)

>>> a
[2017, 2018, 2019]
>>> b
(2017, 2018, 2019)

>>> type(a)
<class 'list'>
>>> type(b)
<class 'tuple'>
```

変更ができるのがリスト。変更ができないのがタプル。つまりイミュータブルなのです。

```python
>>> a[1]=2020 #listは内容変更ができる
>>> a
[2017, 2020, 2019]

>>> b[1]=2020 #tupleは内容変更ができない
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
```
追加ができるのがリスト。追加ができないのがタプル。
append（）を使うと末尾に追加できる。insert(i,value)を使うと指定したインデックスで追加できる。

```python
>>> a[1]=2018 
>>> a.append(2020) 
>>> a
[2017, 2018, 2019, 2020]
>>> a.insert(2,2017.5)
>>> a
[2017, 2018, 2017.5, 2019, 2020]


>>> b.append(2020) #tupleは内容変更ができない
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
```

削除ができるのがリスト。削除ができないのがタプル。
pop（）を使うと末尾に削除できる。pop(i)を使うと指定したインデックスで削除できる。
remove(value)で指定の値を削除できる。指定したいものがない場合はエラー。

```python
>>> a.pop(2) 
2017.5
>>> a
[2017, 2018, 2019, 2020]
>>> a.pop()
2020
>>> a
[2017, 2018, 2019]
>>> a.remove(2019)
>>> a
[2017, 2018]
>>> a.remove(2019)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list

>>> b.pop()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'pop'
>>> b.remove(2019)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'remove'
```

タプルの要素を追加したいときは、リスト同様にタプル同士を結合することで拡張を行うことで追加はできる。
タプルの要素を削除したいときは、スライスを作って、新たな変数に代入することで、削除するのと同じことはできる。

ちなみに要素が１つのタプル作成は要注意。

```python
>>> a = (2018)
>>> a
2018
>>> type(a)
<class 'int'>
```

これだとint型になってしまうので、以下のようにする必要がある。

```python
>>> b = (2018,)
>>> b
(2018,)
>>> type(b)
<class 'tuple'>
```

できること、できないことを整理。

|    tuple    |    list    |
|:------------------:|:------------------:|
|        count        |        append        |
|        index      |        clear        |
|              |        copy        |
|                  |        count        |
|              |        extend        |
|             |        index        |
|             |        insert        |
|             |        pop        |
|         |        remove        |
|             |        reverse        |
|             |        sort        |

基本は要素を変更されたくない場合にタプルを使うことなります。


#　辞書

辞書の作成。

```python
>>> a = {"weight":78.8, "height":175.5}
>>> a
{'weight': 78.8, 'height': 175.5}
```

valueを呼び出し、変数に代入することもできる

```python
>>> b = a["weight"]
>>> b
78.8
```

辞書の追加と変更もできる。

```python
>>> a["age"]=33 #追加
>>> a
{'weight': 78.8, 'height': 175.5, 'age': 33}
>>> a["weight"] = 76.6
>>> a
{'weight': 76.6, 'height': 175.5, 'age': 33}
```

辞書のkey()とvalue()だけを表示することもできる。
またkeyが増えてきた時には、in演算子を使って、keysメソッドで探しだすことができる。

```python
>>> a.keys()
dict_keys(['weight', 'height', 'age'])
>>> a.values()
dict_values([76.6, 175.5, 33])
>>> "weight"in a.keys()
True
```

リスト型同様にpopで削除ができます。


#集合

集合とは、重複する要素をもたない＆順序づけられていない要素の集まりを指します。 
学生時代に習う、和集合、積集合、差集合、対称差もあります。
 set()によって生成することができます。

```python
>>> a = set("abcde")
>>> b = set("defgh")
```
```
>>> a
{'b', 'a', 'e', 'd', 'c'}
>>> b
{'h', 'e', 'd', 'g', 'f'}
```

```python
>>> a-b   
>>> a|b  
```

```python
>>> a-b 　#差集合
{'a', 'c', 'b'}
>>> a|b  #和集合
{'h', 'b', 'a', 'd', 'e', 'g', 'c', 'f'}
>>> a&b 　#積集合
{'d', 'e'}
>>> a^b　　　#対称差
{'h', 'g', 'b', 'a', 'c', 'f'}
```


#　参考

[Pythonの基本的な組み込み型とその一般論まとめ](https://qiita.com/nakasan/items/bc9ba8eb57f5b7a22698)

#　おわり