2014年7月12日土曜日

【第4回】 Pythonの基本的な型: コンテナ、その2 (リストの操作)

前回(第3回)では、コンテナのその1として、リスト、インデクス、スライスについてまとめました。今回は、コンテナのその2として、リストの要素のさらに詳しい操作方法を見てゆきましょう。

Pythonのリストの大変重要な性質として、「内容を変更できる」という点が挙げられます。(英語では mutable と言います。コンテナの中には後に紹介するように変更できないものもあります。)実際にどのように内容を変更するのか、例を見てみましょう。

>>> l = [1,2,3,4,5]
>>> l[0] = 28
>>> l
[28, 2, 3, 4, 5]
>>> l[2:4] = [3, 8]
>>> l
[28, 2, 3, 8, 5]

まず、一行目の入力で、l にリスト [1, 2, 3, 4, 5] を代入します。l[0] は前回説明したとおり、リスト l の一つ目の要素を表します。二つ目の入力で、l[0] = 28 とすると、一つ目の要素が 28 に置き換えられます。実際 l を表示してみると、一つ目の要素が置き換わっているのがわかります。

置き換えは、複数の要素に対して同時に行うこともできます。l [2:4} のスライスで表されるのは、前回学んだ通り、[3, 4] ですが、l[2:4] = [3, 8] とすることで、[3, 4] を [3, 8] に置き換えることができます。実際 l を表示してみると、3番目と4番目の要素が置き換わっているのが確認できます。

注: 同じ型を持つ数値データの集まりを扱うには、 numpy というモジュールが提供する array型を使うことがしばしばより効率的です。numpyについては後ほど詳しく取り上げます。

上記のような方法以外にもPythonにはリストを操作するためのさまざまな関数がデフォルトで組み込まれています。幾つか例を挙げてみましょう。まず、要素を追加するには次のように append を用います。

>>> l = [1, 2, 3, 4, 5]
>>> l.append(6)
>>> l
[1, 2, 3, 4, 5, 6]

l.append(6)とすることで、l の最後に新しい要素 6 が追加されます。リストの最後の要素削除するには pop() を用います。

>>> l.pop()
6
>>> l
[1, 2, 3, 4, 5]

複数の要素を一度に末尾に付け足すには extend() を用います。

>>> l.extend([6, 7])
>>> l
[1, 2, 3, 4, 5, 6, 7]

付け足した末尾2つの要素を取り除くには pop() を2回適用しても構いませんが、次のような方法もあります。

>>> l = l[:-2]
>>> l
[1, 2, 3, 4, 5]

l[:-2] は1番目の要素から最後から3番目までの要素を表すスライス表現です。つまり、l[:-2] は後ろ2つの要素が l から除かれたリストになるので、これを l に代入することで extend() で追加した2つの要素を削除することができます。

また、以下のように操作するとリストの要素を逆順に並べることができます。

>>> r = l[::-1]
>>> r
[5, 4, 3, 2, 1]

l[ : :-1] はスライスで step が -1 に指定されたものです。step を -1 にすることで最後尾の要素から逆順に一つづつ前に戻るという指示ができます。リストは + 演算子を使って結合することができます。

>>> r + l
[5, 4, 3, 2, 1, 1, 2, 3, 4, 5]

また、* 演算子を使うと、同じ内容を繰り返したリストを作ることができます。

>>> 2 * r
[5, 4, 3, 2, 1, 5, 4, 3, 2, 1]

sort() 関数を使うと、要素の数字を昇順に並べ直すことができます。先ほど逆順に並べた r をソートしてみましょう。

>>> r.sort()
>>> r
[1, 2, 3, 4, 5]

r.sort() のような書き方のプログラミングをオブジェクト指向プログラミングと呼びます。(オブジェクト指向プログラミングがどういうものかはここでは気にする必要はありません。) 今、r はリストなので、r に対しては、リストに対して有効なメソッドを適用することができます。iPythonシェルでは、r に対して有効な全メソッドを次のようにして表示することができます。

>>> l. # ここで tabキーをタイプ
 append count extend index insert pop remove reverse sort

メソッドを様々に駆使することでより効率的にリストの操作を行うことができます。ここで、全てのメソッドを紹介するわけにも行かないので、自分でいろいろ実験してみることをおすすめします。次回は、別のコンテナの例として、「文字列」についてまとめる予定です。