Python コレクションの簡単まとめ

# コレクション
- 多くの要素を持つデータ型。複数の値をまとめる時に使われる。
- 2種類ある。
    - シーケンス型: 要素に順番があり、順序でアクセス可能
        - 順番の変更が可能なものとそうでないものがある
    - マッピング型: 順番に意味なし

||順番あり|順番なし|
|---|---|---|
|変更可能|リスト|辞書、集合(Set)|
|変更不可能|タプル、文字列|集合(Frozen Set)|


## リスト
変更可能なシーケンス型。`角括弧[]`で囲んで記述する。異なる方の要素を含むことができる。

```python
>>> squares = [1, 4, 9, 16, 25, 36]
```

インデックスを指定して特定の値を取り出すこともできる。

|値|1|4|9|16|25|36|
|---|---|---|---|---|---|---|
|インデックス|0|1|2|3|4|5|
|インデックス(-)|-6|-5|-4|-3|-2|-1|

```python
>>> squares = [1, 4, 9, 16, 25, 36]
>>> squares[2]
9
>>> squares[-4]
9
```

`スライス`([始点:終点-1])を使うと、一定範囲の値を取り出すことができる。

```python
>>> squares[2:5] # 3〜5番目の値を出力
[9, 16, 25]
>>> squares[-3:] # 後ろから3番目〜最後までの値を出力
[16, 25, 36]
```

値の位置を指定して値を変更することもできる。

```python
>>> squares[4] = 30
>>> squares[-5] = 7
>>> squares
[1, 7, 9, 16, 30, 36]
```

スライスで値を変更することもできる。

```python
>>> squares[2:5] = [10,20,35]
>>> squares
[1, 7, 10, 20, 35, 36]
```

リストには文字列なども入れられる。できることは数値と同じ。

### インプレース演算

リストの値を変える演算を`インプレース演算`という。

#### .sort()メソッド

リスト内の値を並び替える。sorted()関数と似ているが、リストの中身が書き換えられるかどうかが異なる。

```python:sorted()関数
>>> list_a = [1, 4, 3, 5, 2]
>>> sorted(list_a) # 値の並べ替え
[1, 2, 3, 4, 5]
>>> list_a # リストの中身は書き換えられない
[1, 4, 3, 5, 2]
>>> list_a = sorted(list_a) # リストの中身を書き換えたい場合はこの形で
>>> list_a
[1, 2, 3, 4, 5]
```

.sort()メソッドを使うと

```python:.sort()メソッド
>>> list_a = [1, 4, 3, 5, 2]
>>> list_a.sort()
>>> list_a
[1, 2, 3, 4, 5]
```

#### リストの主なメソッド

|メソッド|操作内容|
|---|---|
|list.append(x)|リストの末尾に要素を1つ追加する|
|list.extend(iterable)|あるイテレータのすべての要素を末尾に追加する|
|list.insert(i, x)|インデックスiで指定した位置に要素xを追加する|
|list.remove(x)|リストの中にxと等しい値がある場合、その最初の要素を削除する。等しい値がない場合はValueError|
|list.pop()|リストの末尾を削除し、その要素を返す。括弧にインデックスを指定すると、特定の要素を削除し、その要素を返す。|
|list.clear()|リストの全要素を削除する|
|list.index(x)|リストの中にxと等しい値がある場合、その要素のインデックスを返す。等しい値がない場合はValueError|
|list.count(x)|リストの中にあるxの数を返す|
|list.reverse()|リストの要素を逆順にする|

### del文
リストの要素を削除する方法は.remove()や.pop()だけではない。`del文`でも削除可能。

```python
>>> list = [1, 2, 3, 4, 5]
>>> del list[2] # インデックスを指定して特定の要素を削除する
>>> list
[1, 2, 4, 5]
>>> del list[1:3] # スライスを使って一定範囲の要素を削除する
>>> list
[1, 5]
```


## タプル
変更不可能なシーケンス型。`括弧`で囲んで記述する。

```python
>>> numbers = (1, 2, 3, 4, 5, 6)
```

インデックス、スライスでできることはリストと同じ。

### リストとタプル、どう使い分けるのか

値を変更したくない場合はタプル。

- アプリケーション内の設定値
- CSVのレコードデータの保持
- トランプのカード表現('Spade', '1')

など

## 辞書
キー(key)と値(value)の組み合わせで管理する、順番を持たない(インデックスは使えない)型。この2つを`波括弧`で囲んで記述する。

キーを指定すると値を取り出すことができる。また、キーを指定して値を変更することもできる。

```python
>>> dacho = {'higo':'leader', 'jimon':'muscle', 'ueshima':'kiss'}
>>> dacho['ueshima']
'kiss'
>>> dacho['ueshima'] = 'kururimpa'
>>> dacho['ueshima']
'kururimpa'
```

値だけが欲しい場合は`.values()メソッド`を、キーと値をセットで欲しい場合は`.items()メソッド`を使う。

```python
>>> dacho = {'higo':'leader', 'jimon':'muscle', 'ueshima':'kiss'}
>>> for d in dacho.values():
...   print(d)
... 
leader
muscle
kiss
>>> for d in dacho.items():
...   print(d)
... 
('higo', 'leader')
('jimon', 'muscle')
('ueshima', 'kiss')
```


## 集合(Set)
複合する要素を持たない、順番も持たない(インデックスは使えない)型。`波括弧`で囲んで記述する。要素が重複している場合は1つにまとめられる。`可変。`

```python
>>> hollywood = {'h', 'o', 'l', 'l', 'y', 'w', 'o', 'o', 'd'}
>>> hollywood
{'o', 'w', 'h', 'y', 'd', 'l'}
```

## 集合(Frozen Set)

複合する要素を持たない、順番も持たない(インデックスは使えない)型。`波括弧`で囲んで記述する。要素が重複している場合は1つにまとめられる。`不変。`

### 集合を用いた集合演算

```python
>>> a = {1, 2, 3}
>>> b = {2, 3, 4}
>>> a | b # 和(aかbに含まれる)
{1, 2, 3, 4}
>>> a.union(b)
{1, 2, 3, 4}
>>> a & b # 積(aとbに共通)
{2, 3}
>>> a.intersection(b)
{2, 3}
>>> a - b # 差(aにのみ含まれる)
{1}
>>> a.difference(b)
{1}
>>> a ^ b # 対称差(aもしくはbにのみ含まれる)
{1, 4}
>>> a.symmetric_difference(b)
{1, 4}
```

メソッドの後ろに`_update`を付けると、演算の結果を変数に代入できる。

## 文字列の扱い

文字列は要素を持つ変更不可能なイテレータとして扱われる。スライスを使って一定範囲を取り出すことも可能。

```python
>>> str = 'abcdefg'
>>> str[2:5]
'cde'
```