[Python]04章-02 いろいろなデータ構造（リストの操作）

#[Python]04章-02 リストの操作
ここでは作成したリストについて、要素を追加したり、削除したりするといった操作について学んでいきたいと思います。
操作をするということですので、基本的にはメソッドを利用していきます。

まずは、前回のリストを作成します。今回も**Python Console**を用いて作成していきます。

```.py
>>>ls = ['Japan', 'Canada', 'Australia', 'England', 'German', 'Italy', 'France']
>>>print(ls)
['Japan', 'Canada', 'Australia', 'England', 'German', 'Italy', 'France']
```
##リストへの要素追加
要素の追加には2つの方法があります。それぞれ見ていきましょう。
####（1）appendメソッドの利用
作成した**ls**というリストに、要素を追加することを考えます。要素を追加するには**append**メソッドを利用します。つまり、lsという変数に対して、appendというメソッドで捜査していきます。
**ls**に'America'という要素を追加してみましょう。以下のコードを入力してください。
最初にlsで中身を確認してから、追加してみます。

```.py
>>>ls
['Japan', 'Canada', 'Australia', 'England', 'German', 'Italy', 'France']
>>>ls.append('America')
>>>ls
['Japan', 'Canada', 'Australia', 'England', 'German', 'Italy', 'France', 'America']

```

最後にlsと入力して、lsの中身を確認すると、appendメソッドによって追加された'America'という要素がリストに追加されます。

####（2）extendメソッドの利用
appendメソッドではリストに要素を追加できることを確認しました。では、一度に2つ以上を追加するにはどうすればよいでしょうか？

複数の要素を追加するには**extend**メソッドを利用します。
具体的には以下のようにコードを打って確認していきたいと思います。先ほどと一緒で**ls**の中身を確認してから実行します。

```.py
>>>ls
['Japan', 'Canada', 'Australia', 'England', 'German', 'Italy', 'France', 'America']
>>>ls.extend(['India','Spain'])
>>>ls
['Japan', 'Canada', 'Australia', 'England', 'German', 'Italy', 'France', 'America', 'India', 'Spain']

```

extendメソッドは、()内を**['India','Spain']**のようにリストで指定します。

なお、appendメソッドとextendメソッドは、1つの要素を追加するか、2つ以上の要素を追加するかの違いとなります。
これを誤るとエラーとなります。

##リストからの要素削除
リストから要素を削除する方法についてみていきます。方法は3つあります。
####（1）removeメソッドの利用
**remove**メソッドはリストの中にある要素を直接指定して削除します。

**Python Console**に以下の内容を入力してください。先ほどと一緒で**ls**の中身を確認してから実行します。

```.py
>>>ls
['Japan', 'Canada', 'Australia', 'England', 'German', 'Italy', 'France', 'America', 'India', 'Spain']
>>>ls.remove('Canada')
>>>ls
['Japan', 'Australia', 'England', 'German', 'Italy', 'France', 'America', 'India', 'Spain']
```
上記のように、'Canada'が削除されていることを確認できました。
removeメソッドの場合、要素番号でなく、要素の中身を直接指定して削除をします。

なお、もしリスト内に同じ値のものがあった場合、その値を削除すると最初に現れたものが削除されます。

```.py
>>>numL = [5, 7, 4, 5, 9]
>>>numL.remove(5)
>>>numL
[7, 4, 5, 9]
```

####（2）del文の利用
これはメソッドを利用するわけではないのですが、同じリスト要素の削除方法として**del文**を紹介します。

**Python Console**に以下の内容を入力してください。先ほどと一緒で**ls**の中身を確認してから実行します。

```.py
>>>ls
['Japan', 'Australia', 'England', 'German', 'Italy', 'France', 'America', 'India', 'Spain']
>>>del ls[3]
>>>ls
['Japan', 'Australia', 'England', 'Italy', 'France', 'America', 'India', 'Spain']
```

**del文**の場合、要素を指定しての削除ではなく、要素番号を指定しての削除となります。
今回、del ls[3]を指定したので、3番目の'German'が削除されました。**（もちろん、今回も要素番号は0から始まります）**

####（3）clearメソッドの利用
clearメソッドを利用する際、気をつけなければならないのが、リストの要素をすべて削除することです。ただし、リスト自体は消えずに、空リストとなります。

**Python Console**に以下の内容を入力してください。先ほどと一緒で**ls**の中身を確認してから実行します。

```.py
>>>ls
['Japan', 'Australia', 'England', 'Italy', 'France', 'America', 'India', 'Spain']
>>>ls.clear()
>>>ls
[]
```

##リストの探索
リストに指定した要素があるかどうかを探索する方法を見ていきます。
説明の前に、新しくリストを作ります。今度は数値のリストを作成して、説明していきましょう。

```.py
>>>numL = [60, 80, 70, 90, 50]
>>>numL
[60, 80, 70, 90, 50]
```

####（1）indexメソッドの利用

**index**メソッドを利用すると、指定した要素の位置を返します。
**Python Console**に以下の内容を入力してください。先ほどと一緒で**numL**の中身を確認してから実行します。

```.py
>>>numL
[60, 80, 70, 90, 50]
>>>numL.index(70)
2
```
今回、メソッドをindex(70)と指定しているので、リスト中で70の位置を探索します。すると2番目にあることがわかるので、2を返します。

もちろん、存在しない要素を指定すると以下のようにエラーになります。

```.py
>>>numL.index(100)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: 100 is not in list
```

####（2）in, not inによる有無の確認方法
これはメソッドを利用する方法でなく、リスト内に指定した要素があるかどうかを**in**を用いて確認する方法を紹介します。

**Python Console**に以下の内容を入力してください。先ほどと一緒で**numL**の中身を確認してから実行します。

```.py
>>>numL
[60, 80, 70, 90, 50]
>>>70 in numL
True
>>>100 in numL
False
```
**70 in numL**は「numLというリスト内に70という値は存在するか？」という質問をしており、結果は**真（True）**となります。
また、**100 in numL**は「numLというリスト内に100という値は存在するか？」という質問をしており、結果は**偽（False）**となります。

また逆に、not inを用いて、**存在しないかどうか？**も確認できます。

**Python Console**に以下の内容を入力してください。先ほどと一緒で**numL**の中身を確認してから実行します。

```.py
>>>numL
[60, 80, 70, 90, 50]
>>>70 not in numL
False
>>>100 not in numL
True
```
**70 not in numL**は「numLというリスト内に70という値は存在しないか？」という質問をしており、結果は**偽（False）**となります。
また、**100 not in numL**は「numLというリスト内に100という値は存在しないか？」という質問をしており、結果は**真（True）**となります。


なお、今回出てきた**True**や**False**はブール型という、整数型や文字列型といった分類の1つになります。
今後説明する、if文やwhile文などの制御構文で登場します。

##リストの要素のソート
リスト内の要素を並び替える（ソート）方法を説明します。方法は関数を使い方法とメソッドを使う方法です。

####（1）sorted関数の利用
**sorted関数**により、リストの要素を昇順（もしくは降順）に並べ替えすることができます。

**Python Console**に以下の内容を入力してください。先ほどと一緒で**numL**の中身を確認してから実行します。

```.py
>>>numL
[60, 80, 70, 90, 50]
>>>sorted(numL)
[50, 60, 70, 80, 90]
sorted(numL, reverse=True)
[90, 80, 70, 60, 50]
```

まず、sorted関数の()内は**引数（ひきすう）**といい、この引数にリストを入れると、並べ替えができます。
また、引数の後ろにreverse=Trueを指定すると、降順に並べ替えられます。

なお、上記の状態で、再度**numL**の中身を表示させてみたいと思います。

```.py
>>>numL
[60, 80, 70, 90, 50]
```
この結果から言えるのが、**関数を通しても、numL自体は変わらない**ということ確認できたと思います。

####（1）sortメソッドの利用
**sortメソッド**を指定することで、sorted関数と同じくリストの中身を並べ替えが可能です。
**Python Console**に以下の内容を入力してください。先ほどと一緒で**numL**の中身を確認してから実行します。

```.py
>>>numL
[60, 80, 70, 90, 50]
>>>numL.sort()
>>>numL
[50, 60, 70, 80, 90]
```

sortメソッドで、値を並べ替えられることは分かったのですが、そのままでは出力はされません。それを確認するには、numLの中身を確認する必要があります。

なお、sorted関数の時には、並べ替えをしてもnumL自体はソートされなかったですが、sortメソッドの場合はnumL自体ソートされていることを確認できます。


###最後に
今日はリストに対する多くのメソッド等が登場しました。
基本的なメソッドは覚えておいて損はないですが、細かな引数の指定など、調べてみるのもよいでしょう。

[リスト関連のメソッド](https://docs.python.org/ja/3/tutorial/datastructures.html)

###[【目次リンク】へ戻る](https://qiita.com/ko0821/items/379e8bd9e6ea01089419)