Pythonチートシート - List型の使い方一覧

仕事や学習の時に役立つちょっとしたチートシートを作ってみることにしました。今回は個人的にPythonの学習で一番使う機会の多い、List型の使い方をまとめてみました。

## コレクションとコンテナについて
データ型の中でも、複数の値を束ねるための仕組みをコレクション・コンテナと呼びます。Pythonにおけるコンテナは、シーケンス・セット・ディクショナリーの3型があります。
- シーケンス - 順に並んだ値を扱う。中身の重複・異なる型をあつかえる。いわゆる配列
- セット - 順序を持たず、値の重複ができない。数学の集合に近い
- ディクショナリー - キー・値の仕組みで要素を管理する。キーは重複不可・値はOK。

## シーケンスについて（要素を参照・スライス）
シーケンス型にはlist, tuple, range等の型があります。シーケンス型の要素には、インデックス値を使ってアクセスすることができます。

listが扱えるのはイテラブルな型で、`list(iterable)`という宣言でインスタンス化することができます。他にもリスト内包表記や、`sorted(), split()`といったメソッドがlistを返します。

```python
my_list = list(["x","y","z"])
my_list02 = list("abc")

print(my_list)
print(my_list_02)

# 要素の参照とスライス構文
# list[start:end:step]
my_list03 = list("あいうえこかきくけこ")

#要素を前から順(0から開始)に抽出
print((my_list03[0]))
#要素を後から順(-1から開始)に抽出
print((my_list03[-1]))

# スライス構文で複数の要素を抽出
print(my_list03[0:4])
print(my_list03[5:9])
print(my_list03[0:9:2])

# リストの要素数を取得(len)
len(my_list03)
```
```
['x', 'y', 'z']
['a', 'b', 'c']
あ
こ
['あ', 'い', 'う', 'え']
['か', 'き', 'く', 'け']
['あ', 'う', 'こ', 'き', 'け']
```
## listの要素の操作について(insert, pop, remove,clear)
listのメソッドを使うことで、要素を追加・削除できます。

```python
my_list_04 = list("abcdefghijklmn")
my_list_04.append("o")  # 末尾に追加
print(my_list_04)

my_list_04.insert(5, "*INSERTED*")  # インデックスの直前に追加
print(my_list_04)

my_list_04.pop([4])  # インデックスの値を削除（値を取り出している）
print(my_list_04)

my_list_04.remove("a")  # 要素を削除（前から順にヒットした1つの要素のみ
print(my_list_04)

my_list_04.clear()  # リストを空リストにする
print(my_list_04)
```

```
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['a', 'b', 'c', 'd', 'e', '*INSERTED*', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o']
['a', 'b', 'c', 'd', 'e', '*INSERTED*', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
['b', 'c', 'd', 'e', '*INSERTED*', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n']
[]
```

試しに、listのメソッドを使ってスタック(後入れ先出し式、LIFO)を実装してみました。

```python
data =[]
data.append(10)
data.append(15)
data.append(30)

print(data)
print(data.pop())
print(data)
```
```
[10, 15, 30]
30
[10, 15]
```

リスト内包表記を使って指定した全ての要素を削除することもできます。

```python
data = list(["a","b","b","a","c"])
data = [elem for elem in data if elem != "a"]

print(data)
```

```
['b', 'b', 'c']
```

スライスを使えば、指定したインデックスの間にある複数の要素をまとめて置換することができます。
```python
data = list("あいうえお")
data[1:4] = ["1","2","3"]
print(data)

del data[1:4]
print(data)
```
```
["あ","1","2","3","お"]
["あ","お"]
```
## リストの検索と置換・回数をカウント(index,count)
indexメソッドでリスト内の要素を検索してインデックス値を返り値にすることができます。検索範囲のインデックスと、降順・昇順を指定することができます。
```python
data = list("いろはにほへとちりぬるを")

print(data.index("い"))
print(data.index("ち", 4))
print(data.index("ち", 4, 7))
print(data.index("ち", -4, -1))
```

```
0
7
7
7
```


同一の要素が登場する回数をカウントするには、countメソッドを使います。
```python
data = list("いろはにほへとちりぬるを・いろいろ")
print(data.count("い"))
```

```
3
```
## リストの連結(演算子,append)
appendを使ってリストを連結しようとすると、リストそのものが1つの要素として扱われてしまいます。要素を各個ごとに連結した場合は、演算子を使います。
```python
data = list("いろはにほへと")
data02 = list("ちりぬるを")
print(data + data02)

data03 = list()
data03 += data
data03 += data02
print(data03)

# appendを使ってリストを連結しようとすると、リストそのものが1つの要素として扱われてしまう
data04 = data
data04.append(data02)
print(data04)
```
```
['い', 'ろ', 'は', 'に', 'ほ', 'へ', 'と', 'ち', 'り', 'ぬ', 'る', 'を']
['い', 'ろ', 'は', 'に', 'ほ', 'へ', 'と', 'ち', 'り', 'ぬ', 'る', 'を']
['い', 'ろ', 'は', 'に', 'ほ', 'へ', 'と', ['ち', 'り', 'ぬ', 'る', 'を']]
```
## リストをソートする(sort)
sortメソッドを用いて、リストの要素を降順・昇順にソートすることができます。
sortは要素の型に応じて大小を判定します。数値型は値の大小で、文字型は文字の辞書順でソートされます。
sortの引数にキーオプションとラムダ式を使えば、独自のルールで並べ替えることができます。

```python
data_numeric = [205, 13, 78, 65]
data_string = ["banana","apple","orange","melon"]
data_lambda = ["pen","ipad","mouse","waterbottole"]
data_numeric.sort()
data_string.sort()
data_lambda.sort(key=lambda x:len(x))  # リテラルの文字数でソートする

print(data_numeric)
print(data_string)
print(data_lambda)
```

```
[13, 65, 78, 205]
['apple', 'banana', 'melon', 'orange']
['pen', 'ipad', 'mouse', 'waterbottole']
```

## リストをforループを使って処理(enumerate, zip)
インデックス・値をforで取り出すほかにもenumerate・zipを使うことでより複雑なリスト処理が実装できます。
```python
data = ["Panda","Rabbit","Koara","Tiger"]
data02 = ["パンダ","ウサギ","コアラ","トラ"]

# インデックスと値を全て表示
for index, value in enumerate(data):
    print(index, ":",value)

# 二つのリストの値を双方抽出する
for d1, d2 in zip (data, data02):
    print(d1, " Translated: ", d2)
```

```
0 : Panda
1 : Rabbit
2 : Koara
3 : Tiger
Panda  Translated:  パンダ
Rabbit  Translated:  ウサギ
Koara  Translated:  コアラ
Tiger  Translated:  トラ
```
## リスト内要素の真偽を判定(all, any, not any)
allで全てがTrueか、anyで1つでもTrueがあるか、not anyで全てがFalseかを判定できます。要素が空か否か、条件を満たしているかも判定できます。
```python
print(all([False, True, False]))
print(any([False, True, False]))
print(not any([False, True, False]))

print(any(["",""]))

data =["Rose","Cherry","Lily","Tulip"]
print(any([len(str)> 4 for str in data]))
```

```
False
True
False
False
True
```
## リスト内要素を加工→新しいリストをつくる(map)
mapメソッドとラムダ式を組み合わせることで、リスト内包のように新しいリストを生成できます。2つ以上のリストを組み合わせる表記も可能です。

```python
data = [1,3,5]
result = map(lambda v: v : v, data)
print(list(result))

data = [1,3,5]
data2 = [2,7,10]
result = map(lambda v1, v2:v1*v2,data, data2)
print(list(result))
```

```[1, 9, 25]
[2, 21, 50]
```
## リストの要素を条件で絞り込み(filter)
リストの要素を条件で絞り込むには、filterメソッドを使います。
```python
data = ["フレンチブルドッグ","ヨークシャーテリア","コーギー"]
result = filter(lambda v:len(v) < 8,data)
print(list(result))
```
```
['コーギー']
```
## リストから最大値・最小値を取得(max, min)
リストから最大値・最小値となる要素を取得したい時は、組み込み関数max(), min()を使います。
```python
list = [3, 6, 7, -1, 23, -10, 18]
print(max(list))
print(min(list))
```
```
23
-10
```

## 2023/1/18、追記
編集リクエストを頂いた方(@WolfMoon)にテキストブロックの書き方を訂正していただきました。ありがとうございます:)


## 2023/1/19、追記
```python
y_list = list(["x","y","z"])
```
この表記だとリストを作成したうえでさらにそのコピーを作る処理となっているという指摘を頂きました。(@shiracamus)　次回からはリストの作成はこのように表記します。
```python
y_list = ["x","y","z"]
```