[アルゴリズム×Python]   リストの使いかた

アルゴリズムとPythonについて書いていきます。

目次
0.アルゴリズムとは
1.リストとは
2.リストの使いかた
　2-0.リストの作成
　2-1.リスト内包表記
　2-2.他のデータ型からリストをつくる
　2-3.要素の取得
　2-4.要素の更新
　2-5.要素の追加
　2-6.要素の削除
　2-7.要素の並べ替え
　2-8.リストのリスト
　2-9.リストの結合
　2-10.その他の操作



#0.アルゴリズムとは

計算や作業をするための手順のことです。
**短時間**で**効率的**に処理をすることを目指します。

#1.リストとは

**データ構造**の1つで、データを一直線に並べた構造をしています。
大量のデータを扱うアルゴリズムではよく使われます。
リストは**データの追加や削除がしやすい**反面、アクセスに時間がかかります。



**Point**　:　データ構造
データをコンピュータのメモリにいれる時に、データの順番や位置関係などを定めたものです。



###1-0.Pythonとリスト

Pythonでは、配列よりもリストを使うことが多いです。
リストの要素は、**任意のPythonオブジェクト**で良いです。
そして、要素の型は**統一しなくて良い**です。

**Point**　:　配列
**データ構造**の1つで、データを一列に並べるものです。
データへのアクセスは簡単に行える反面、追加や削除には手間がかかります。



#2.リストの使いかた












###2-0.リストの作成

◯``リストの名前 = []``という形でリストをつくります。

```.py
#要素がない空のリストをつくる
color_list = []
```
もちろん最初から要素を入れてつくることもできます。
その場合は、下のように**カンマで区切って**要素を入れます。

```.py
#リストに要素をいれる
color_list = ['Red','Yellow','Green']
```

---

###2-1.リスト内包表記

◯様々な種類のリストを効率的につくるために、リスト内包表記が使われます。

---

####リスト内包表記とは

◯リストをつくる方法の1つです。
**[リストに格納する要素 for 要素 in イテラブルオブジェクト]**という形で定義します。
**リストに格納する要素**は、要素を使用した**式**です。
**イテラブルオブジェクト**は、要素を1つずつ取り出すことのできるオブジェクトのことです。

---

####リスト内包表記の使用例

◯range()関数はイテラブルオブジェクトを返します。

```ex0.py
#1以上10未満の整数を1つずつ取り出して、その値をnumbersリストに格納する
numbers = [number for number in range(1,10)]
print(numbers)
```

```.py
[1, 2, 3, 4, 5, 6, 7, 8, 9]
```

```ex1.py
#1以上10未満の整数を1つずつ取り出して、それに2をかけた値をnumbersリストに格納する
numbers = [number * 2 for number in range(1,10)]
print(numbers)
```

```.py
[2, 4, 6, 8, 10, 12, 14, 16, 18]
```

```ex2.py
#1以上10未満の整数を1つずつ取り出して、偶数の値のみをnumbersリストに格納していく
numbers = [number for number in range(1,10) if number % 2 == 0]
print(numbers)
```

```.py
[2, 4, 6, 8]
```


```ex3.py
#文字列のリスト
list_1 = ['1','2','3']
#文字列のリストlist_1から要素を1つずつ取り出して、整数にしてからリストnumbersに格納する
numbers = [int(i) for i in list_1]
print(numbers)
```

```.py
[1, 2, 3]
```


```ex4.py
#取り出した要素が奇数ならばそのまま格納して偶数ならば2乗してから格納する
numbers = [i if i % 2 == 1 else i**2 for i in range(10)]
print(numbers)
```


```.py
[0, 1, 4, 3, 16, 5, 36, 7, 64, 9]
```



























---








###2-2.他のデータ型からリストをつくる
####list()関数を使ったリストの作成

◯list()関数を使えば、他のオブジェクトをリストにすることができます。

```.py
#文字列をリストに変換する
list('book')
```

```.py
#文字列をリスト化した場合、文字の1つ１つがリストの要素となる
['b','o','o','k']
```
####split()関数を使ったリストの作成

◯split()関数を使えば、何らかのセパレータ文字列に基づいて、文字列を分割してリストにすることができます。

```.py
#オブジェクト　birthday　に中身をいれる
birthday = '29/9/1993'
#どこで分割したいかを決めて(今回はスラッシュ = /)分割する
birthday.split('/')
```
```.py
['9','29','1993']
```




---


###2-3.要素の取得

####[offset]を使った要素の取得

◯[offset]を使ってリストから要素を取り出すことができます。
一番左の要素のオフセットは、0であることに注意してください。

```.py
#文字列を要素に持つリストをつくる
color_list = ['Red','Yellow','Green']
#オフセットで指定したリストの要素を取得する
print(color_list[0])
print(color_list[2])
print(color_list[-1])
```

```.py
'Red'
'Green'
'Green'
```

リストの要素数が多い場合などは、リストの後ろから、-1,-2...という風にインデックスを使って、要素を指定することができます。

今回の場合では、文字列``'Green'``をオフセットを使って、左から指定する場合は、``color_list[2]``となり、リストの最後から負のインデックスを使って、指定する場合は、``color_list[-1]``となります。

---

####enumerate()関数を使った要素とインデックスの取得


◯enumerate()関数を使うと、効率的に要素とインデックスを取得することができます。

```enumerate0.py
#オブジェクト(変数)sに文字列を代入する
s = 'TOKYO'
#forループを使って、効率的に要素(item)とそのインデックス(offset)を取得する
for (offset,item) in enumerate(s):
    print(item,' のインデックスは　',offset)
```

```
T のインデックスは 0
O のインデックスは 1
K のインデックスは 2
Y のインデックスは 3
O のインデックスは 4
```

```enumerate1.py
#色の要素のリストをつくる
color_list = ['Red','Yellow','Green','Blue','White']

#リストから要素(文字列)とそのインデックスを取得する
for i,color in enumerate(color_list):
    print(color,' は ',i,' 番目です')
```

```
Red は 0 番目です
Yellow は 1 番目です
Green は 2 番目です
Blue は 3 番目です
White は 4 番目です
```

---

####スライスを使った複数の要素の取得


◯スライスを使って複数の要素を取り出すことができます。
リストをスライスしたものもリストになります。

``[start:end]``で要素を取得する場合は、オフセットでstartから**end-1**までの要素を取得します。("2-3.要素の更新"にスライスの詳しい説明があります。)

```.py
alphabet = ['A','B','C','D','E']
```

```slice0.py
#オフセットで、0から2(3-1)の要素を取得することができます。
alphabet[0:3]
```

```.py
['A', 'B', 'C']
```

---

####ステップを使った複数の要素の取得

```slice1.py
#リストの先頭から2つ分のステップ(一つおきに)で要素を取得する
alphabet[::2]
```

```.py
['A', 'C', 'E']
```

◯マイナスを使うと末尾から要素を取得することができます

```slice2.py
#リストの末尾から2つ分のステップ(一つおきに)で要素を取得する
alphabet[::-2]
```

```.py
['E', 'C', 'A']
```


◯ステップを応用するとリストの要素を逆順にすることができます↓

```slice3.py
#リストの要素を末尾から順に取得する
alphabet[::-1]
```

```.py
['E','D','C','B','A']
```









---


###2-4.要素の更新

####[オフセット]を使った要素の書き換え

```.py
#アジアの国名のリストをつくる
asian_countries = ['China','India','Japan']

#リストの左から2番目の要素に'Russia'を代入する
asian_countries[1] = 'Russia'
print(asian_countries)
```

---


####スライスを使った要素の更新

◯スライスを使えば、指定した範囲にある要素を取得して、それを置き換えることができます。

``[:]``先頭から末尾までの要素を取得する
``[start:]``startオフセットから末尾までの要素を取得する　
``[:end]``先頭からend-1オフセットまでの要素を取得する
``[start:end]``startオフセットからend-1オフセットまでの要素を取得する
``[start:end:step]``startオフセットから、stepごとに、end-1オフセットまでの要素を取得する。


---

#####[:]を使った要素の更新

◯リストを丸々更新します。

```.py
numbers = [1,2,3,4,5,6,7,8,9]

#先頭から末尾まで全ての要素を取得して、置き換えます。
numbers[:] = ['one','two','three','etc']
print(numbers)
```

```.py
['one','two','three','etc']
```

---

#####[start:]を使った要素の更新

◯指定した場所から末尾までの要素を置き換えます。
代入のようなイメージです。


```.py
numbers = ['one','two','three','etc']

#オフセット3から末尾までの要素を指定して置き換える
numbers[3:] = ['four','five','six']
print(numbers)
```

```.py
['one', 'two', 'three', 'four', 'five', 'six']
```

---

#####[:end]を使った要素の更新

◯先頭からend-1までの要素を取得して置き換えます。

```.py
numbers = [4,5,6,7,8,9]

#先頭からend-1、つまり0から-1の範囲の要素を取得して置き換えます。
#-1から0までのスペースにリスト[1,2,3]を代入するイメージです。
numbers[:0] = [1,2,3]
print(numbers)
```

```.py
[1,2,3,4,5,6,7,8,9]
```

---

#####[start:end]を使った要素の更新

◯オフセットで、``start　<=　要素　<　end``　の範囲を取得して、置き換えます。

```.py
numbers = [1,2,3,4,5,6,7,8,9]

#オフセットで、0から2(3-1)までの範囲の要素を取得して、置き換えます。
numbers[0:3] = ['one','two','three']
print(numbers)
```

```.py
['one', 'two', 'three', 4, 5, 6, 7, 8, 9]
```

---


#####[start  : end : step] を使った要素の更新

◯startからend-1の範囲で、stepごとに要素を取得して置き換えます。

```.py
numbers = [1,2,3,4,5,6,7,8,9]

#オフセット2から3つおきに要素を取得して、それをリスト['three','six','nine']と置き換えます。
numbers[2::3] = ['three','six','nine']
print(numbers)
```

```.py
[1, 2, 'three', 4, 5, 'six', 7, 8, 'nine']
```

























###2-5.要素の追加

####append()関数を使った要素の追加

◯末尾に要素を追加します。

```ex0.py
#アジアの国名のリストをつくる
asian_countries = ['China','India','Japan']

#末尾に要素を追加する
asian_countries.append('Russia')
print(asian_countries)
```

```.py
['China', 'India', 'Japan','Russia']
```

---


####insert()関数を使った要素の追加

◯オフセットを使って、指定した場所に要素を追加します。

```.py
asian_countries = ['China','India','Japan']

#リストのオフセット2のところに文字列'Indonesia'を追加する。
asian_countries.insert(2,'Indonesia')
```

```.py
['China', 'India', 'Indonesia', 'Japan']
```
































###2-6.要素の削除

####delと[オフセット]を使った要素の削除

◯del リストの名前[オフセット]という形で、指定した要素を削除します。

```.py
asian_countries = ['China','India','Indonesia','Japan']

#delはPythonの文で、代入(=)の逆のようなもの。
#delはメソッドではない
del asian_countries[2]
print(asian_countries)
```

```.py
['China','India','Japan']
```



---



####remove()関数を使った要素の削除

◯消したい要素がどこにあるかわからない場合などに使います。

```.py
asian_countries = ['China','India','Indonesia','Japan']

#要素を指定して削除する
asian_countries.remove('Indonesia')
print(asian_countries)
```

```.py
['China','India','Japan']
```

---

####pop()関数を使った要素の削除

◯リストから要素を取り出し、それと同時にその要素を削除することができます。

```.py
asian_countries = ['China','India','Indonesia','Japan']

#要素を指定して削除する
print(asian_countries.pop(2))
```
```.py
Indonesia
```

```.py
print(asian_countries)
```

```.py
['China','India','Japan']
```








###2-7.要素の並べ替え

####sort()関数を使った並べ替え

◯その場でリストをソートします。デフォルトは昇順です。文字列の場合は、アルファベット順です。

```.py
alphabet = ['A','E','D','C','B']

#並べ替える文字列は全て同じ型である必要がある
alphabet.sort()
print(alphabet)
```

```.py
['A', 'B', 'C', 'D', 'E']
```


---


####sorted()関数を使った並べ替え

◯リストをコピーしてそれをソートします。なのでリストのオリジナルは変更されません。

```.py
#整数と浮動小数点数は、混じっていてもソートできる
numbers = [ 2 , 1.5 , 1 , 0 , 0.5 , 2.5]

#新しいリストsorted_numbersをつくって
#numbersリストをソートしたものを代入する
sorted_numbers = sorted(numbers)

print('sorted_numbers =' , sorted_numbers)
print('numbers =' , numbers)
```

```.py
sorted_numbers = [0, 0.5, 1, 1.5, 2, 2.5]
numbers = [2, 1.5, 1, 0, 0.5, 2.5]
```













###2-8.リストのリスト


◯Pythonのリストは、Pythonオブジェクトを要素とすることができます。
なので、リストそのものも、他のリストの一要素として扱うことができます。

```.py
#国の名前のリストをつくる
asia = ['China','India','Indonesia']
americas = ['USA','Brazil','Mexico']
africa = ['Nigeria','Ethiopia','Egypt']
#リストを含むリストをつくる
countries = [asia,americas,africa,'Japan']
```

```ex0.py
#リストを含むリストを表示する
print(countries)
```

```.py
[['China', 'India', 'Indonesia'], ['USA', 'Brazil', 'Mexico'], ['Nigeria', 'Ethiopia', 'Egypt'], 'Japan']
```

```ex1.py
#オフセットでリストの中の要素を指定する
print(countries[0])
```

```.py
['China', 'India', 'Indonesia']
```

◯countriesリストの中のオフセット1の要素(americasリスト)中の、オフセット2の要素を取得します

```ex2.py
#2段階で要素を指定する
print(countries[1][2])
```

```.py
Mexico
```








































###2-9.リストの結合

####extend()関数を使ったリストの結合

◯extend()関数を使って、2つのリストを結合します。
リストの中の要素が全て1つのリストの中に入ります。

```.py
list1 = ['a','b','c']
list2 = ['d','e','f']

#2つのリストを結合して新しいリストにする
list1.extend(list2)
print(list1)
```

```.py
['a', 'b', 'c', 'd', 'e', 'f']
```

---


####+=を使ったリストの結合

◯**+=**を使って、2つのリストを結合します。

```.py
list_a = [1,2,3]
list_b = [4,5,6]

#2つのリストを結合して新しいリストにする
list_a.extend(list_b)
print(list_a)
```

```.py
[1,2,3,4,5,6]
```

※同じ状況で、append()を使ったら、リストが一つの要素として、他のリストに追加されます。

```.py
list_a = [1,2,3]
list_b = [4,5,6]

#リストが一要素として他のリストに追加される
list_a.append(list_b)
print(list_a)
```
```.py
[1,2,3,[4,5,6]]
```















###2-10.その他の操作

####index()関数を使ったオフセットの取得

◯要素のオフセットを知りたい場合に使います。

```.py
asian_countries = ['China','India','Indonesia','Japan']

#文字列'Japan'のオフセットを取得する
print(asian_countries.index('Japan'))
```

```.py
3
```

---

####inを使った値の有無のテスト

```.py
asian_countries = ['China','India','Indonesia','Japan']

#ある値がリストの中にあるかどうかを知る
print('Japan' in asian_countries)
print('Russia' in asian_countries)
```

```.py
True
False
```

---

####count()関数を使った、値の個数の計算

```.py
#文字列をリスト化したものを変数charactersに代入する
characters = list('personal_computer')
print(characters)

['p', 'e', 'r', 's', 'o', 'n', 'a', 'l', '_', 'c', 'o', 'm', 'p', 'u', 't', 'e', 'r']

#charactersというリストの中に 'o' がいくつ含まれているかを調べる
print(characters.count('o'))
```

```.py
2
```
---

####len()関数を使った長さの取得

```.py
#リストcharactersの要素の数を調べる
print(len(characters))
```

```.py
17
```




#最後に

読んでいただきありがとうございました。
次はリストについてもう少し詳しく書いていきたいと思います。
間違いや改善点などございましたら、ご指摘の程よろしくお願い致します。