【Python3エンジニア認定基礎試験】5. データ構造

リストのメソッド
---
Pythonのリストには多くのメソッドが用意されており、以下のような操作が可能です。
```
list.append(x):
```

`append`: リストの末尾に要素を一つ追加します。
```
fruits = ['apple', 'banana']
fruits.append('cherry')
# fruits: ['apple', 'banana', 'cherry']
```

`extend`: イテラブル（リスト、タプルなど）のすべての要素をリストに追加します。
```
fruits = ['apple', 'banana']
fruits.extend(['cherry', 'date'])
# fruits: ['apple', 'banana', 'cherry', 'date']
```

`insert`: 指定した位置 i に要素 x を挿入します。
```
fruits = ['apple', 'banana']
fruits.insert(1, 'cherry')
# fruits: ['apple', 'cherry', 'banana']
```

`remove`: リスト中で最初に見つかった x を削除します。
```
fruits = ['apple', 'banana', 'cherry', 'banana']
fruits.remove('banana')
# fruits: ['apple', 'cherry', 'banana']
```

`pop`: 指定した位置 i の要素をリストから削除し、返します。
インデックスが指定されない場合は、リストの末尾の要素を削除して返します。
```
fruits = ['apple', 'banana', 'cherry']
fruits.pop(1)
# fruits: ['apple', 'cherry']
```

`clear`: リスト中の全ての要素を削除します。
```
fruits = ['apple', 'banana', 'cherry']
fruits.clear()
# fruits: []
```

`index`: リスト中で x と等しい値を持つ最初の要素の位置を返します。
start および end を指定して検索範囲を限定することも可能です。
```
fruits = ['apple', 'banana', 'cherry', 'banana']
fruits.index('banana', 2)
# returns 3
```

`count`: リスト中に x が出現する回数を返します。
```
fruits = ['apple', 'banana', 'cherry', 'banana']
fruits.count('banana')
# returns 2
```

`sort`: リストの要素をインプレースでソートします。
オプションで key を指定してカスタムソートを行い、`reverse=True` を指定すると、リストが逆順にソートされます。
```
fruits = ['apple', 'banana', 'cherry']
fruits.sort(reverse=True)
# fruits: ['cherry', 'banana', 'apple']
list.reverse():
```

`reverse`: リストの要素を逆順に並べ替えます。
```
fruits = ['apple', 'banana', 'cherry']
fruits.reverse()
# fruits: ['cherry', 'banana', 'apple']
```

`copy`: リストの浅いコピーを返します。a[:] と等価です。
```
fruits = ['apple', 'banana', 'cherry']
new_fruits = fruits.copy()
# new_fruits: ['apple', 'banana', 'cherry']
```

リストをキューとして使うこともできますが、効率が良くない場合があります。
キューでは、最初に追加した要素が最初に取り出される ("first-in, first-out") 性質を持ちます。
リストの先頭に要素を追加（insert(0, x)）し、取り出し（pop(0)）を行うことは非効率です。
そのため、collections.deque を使用するのが推奨されます。
```
from collections import deque
queue = deque(["Eric", "John", "Michael"])
queue.append("Terry")  # Terry arrives
queue.append("Graham") # Graham arrives
queue.popleft()        # The first to arrive now leaves
# returns 'Eric'
queue.popleft()        # The second to arrive now leaves
# returns 'John'
# queue: deque(['Michael', 'Terry', 'Graham'])
```

リストの内包表記
---
リスト内包表記は、リストを生成する簡潔な方法を提供します。
シーケンスやイテラブルの要素に対して操作を行い、新しいリストを作成できます。

平方のリストを作成:
```
squares = [x**2 for x in range(10)]
# squares: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
```

条件付きリスト内包表記:
```
vec = [-4, -2, 0, 2, 4]
non_negative = [x for x in vec if x >= 0]
# non_negative: [0, 2, 4]
```

関数適用:
```
from math import pi
rounded_pi = [str(round(pi, i)) for i in range(1, 6)]
# rounded_pi: ['3.1', '3.14', '3.142', '3.1416', '3.14159']
```

リストのフラット化:
```
vec = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
flattened = [num for elem in vec for num in elem]
# flattened: [1, 2, 3, 4, 5, 6, 7, 8, 9]
```

ネストしたリストの内包表記
内包表記の中にさらに内包表記を含めることもできます。
行列の転置を行う場合:
```
matrix = [
    [1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
]

transposed = [[row[i] for row in matrix] for i in range(4)]
# transposed: [[1, 5, 9], [2, 6, 10], [3, 7, 11], [4, 8, 12]]
```

zip(): 関数を使用して同様の結果を得ることもできます:
```
list(zip(*matrix))
# [(1, 5, 9), (2, 6, 10), (3, 7, 11), (4, 8, 12)]
```

del 文
---
del 文はリストから要素を削除するために使用できます。値ではなくインデックスを指定して要素を削除します。リスト全体やスライスも削除できます。

要素の削除:
```
a = [-1, 1, 66.25, 333, 333, 1234.5]
del a[0]
# a: [1, 66.25, 333, 333, 1234.5]
```
スライスの削除:

```
del a[2:4]
# a: [1, 66.25, 1234.5]
```

リスト全体の削除:
```
del a[:]
# a: []
```

変数全体の削除:
```
del a
# 以後、a を参照するとエラーになります。
```

del 文はリスト以外のデータ構造や変数にも使うことができます。

https://qiita.com/FT_log/items/b62f52ede0d5f5c3279b