～ 配列 ～ チートシート

#目次
[listの作成](#listの作成)　`mat = [[0] * W for i in range(H)]`
[arrayの作成](#arrayの作成)　`import array`　`mat = array.array('i', mat)`
[配列のコピー](#配列のコピー)　`copy.deepcopy()`
[要素の追加](#要素の追加) `.append()`
[要素の挿入](#要素の挿入) `.insert(position, num)`
[要素の削除](#要素の削除)　`.pop()`　`del mat[]`　`remove()`　`clear()`
[重複した要素を削除](#重複した要素を削除)　`list(set())`　`list(dict.fromkeys())`
[要素の検索](#要素の検索)　`.index()`
[要素の個数](#要素の個数)　`.count()`

[ソート](#ソート)　`.sort(reverse=False)`　`sorted()`　（もしかして：[優先度付きキュー](https://qiita.com/ysys_Ba/items/90476af66df4ba954f06#%E7%9B%AE%E6%AC%A1)）

#はじめに

チートシートの扱いついては[ここ](https://qiita.com/ysys_Ba/items/d27282b888abbd1f43e7#%E3%83%81%E3%83%BC%E3%83%88%E3%82%B7%E3%83%BC%E3%83%88%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)を読んでください

#listの作成

```python:array.py
mat = [0] * N
```

0埋めの配列を作る
1次元の場合は簡単

```python:array.py
mat = [i for i in range(N)]
```

`for` を使ってこういうこともできる（`[0, 1, 2, 3, 4, ..... , N-1]` を作成）

```python:array.py
mat = [[0] * W for i in range(H)]
#     [[0] * 横 for i in range(縦)]
```

２次元の場合はちょっと面倒
`mat = [[0]*W]*H` だと２次元配列自体は作れても個別での要素の変更ができないのでアウト

#arrayの作成

**まずはライブラリをインポート** `import array`

arrayはlistと異なり、１つの型（数字のみ）、１次元のみしか扱えない
listより高速に挿入などの処理ができる（要検証）

```python:array.py
import array

mat = [0]*N
mat = array.array('i', mat)
```

`array.array()` の第一引数で要素の型を指定する（`int`なら`i`、`float`なら`f`）

#配列のコピー

```python:array.py
import copy
mat_new = copy.deepcopy(mat)
```

for文で１つずつ要素をコピーしてもいいけどこっちのほうが楽
`import copy`を忘れずに
サッと書けるので便利だけど、同じ大きさの配列定義してfor文で代入した方がかなり早いので、実行時間がシビアな場合は注意

```python:array.py
mat_new = mat[:]
```

１次元の場合はこれでもOK

#ソート

```python:array.py
mat.sort(reverse=False)
```

`.sort()`の前につけた配列を降順でソート（破壊的）
`(reverse=True)`にすると降順になる

```python:array.py
new_mat = sorted(mat)
```

`()`内に入れた配列を降順でソートし渡す
`sorted()`は`.sort()`と違い非破壊的なので、元の配列が保持される

#重複した要素を削除

```python:array.py
mat = list(set(mat))
```

配列を昇順でソートしたうえで、重複した要素を削除する
`set()`だと配列ではないので`list()`で配列に戻す

```python:array.py
mat = list(dict.fromkeys(mat))
```

`list(dict.fromkeys())`を使えばソートせずに重複した要素を削除することが可能

#要素の削除

```python:array.py
mat = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

mat.pop(7)
```

```python:mat
>>> [0, 1, 2, 3, 4, 5, 6, 8, 9]
```

１つしか要素を削除しないならば`.pop()`も可能

```python:array.py
mat = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

del mat[7]
```

```python:mat
>>> [0, 1, 2, 3, 4, 5, 6, 8, 9]
```

削除したい要素を指定し削除できる

```python:array.py
mat = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

del mat[5:]
#del mat[:5]
#del mat[3:6]
```

```python:mat
>>> [0, 1, 2, 3, 4]
>>> [5, 6, 7, 8, 9]
>>> [0, 1, 2, 6, 7, 8, 9]
```

`del`ならば配列の要素をまとめて削除することも可能

```python:array.py
mat = [1, 1, 4, 5, 1, 4]

mat.remove(4)
```

```python:mat
>>> [1, 1, 5, 1, 4]
```

指定した要素のうち、最初の１つだけが削除される

```python:array.py
mat = [1, 1, 4, 5, 1, 4]

mat.clear()
```

```python:mat
>>> []
```

全ての要素を削除し、空集合に

#要素の検索

```python:array.py
mat = [1, 1, 4, 5, 1, 4]

print(mat.index(4))
```

```python:mat
>>> 2
```

要素の格納されている位置を返す（最初の１つだけ）
要素に含まれない値を指定するとエラーを吐くので注意

#要素の個数

```python:array.py
mat = [1, 1, 4, 5, 1, 4]

print(mat.count(1))
```

```python:mat
>>> 3
```

配列内の指定した要素の個数を返す

#要素の追加

```python:array.py
mat.append(n)
```

`n`が`mat`の最後に追加される

#要素の挿入

```python:array.py
mat.insert(position, n)
```

`n`が`mat`の`position`番目(インデックス番号)に追加される
要素を最後に追加するだけではダメな場合（最初に追加したい場合など）に使う

計算量が`O(log(N))`とかなり必要なので、できれば使用を避けたい（`.append()`で配列の最後に追加する場合は`O(log(1))`で済む）
**[array](#arrayの作成)を用いると、listより高速で挿入ができる（理由は知らない）**