これからPythonを学習していく中で徐々にわかってくると思いますが、コンテナの扱いに慣れることがPythonを使いこなす上での肝となります。今回は、コンテナ型の初回として、コンテナ型の1つである「リスト」と、リストを操作する上で基本となる「インデクス」と「スライス」についてまとめてみます。
リストは順序つきのオブジェクトの集まりです。(順序付きというところが大切です。後に順序がつかないコンテナ型も登場します)。要素となるオブジェクトは異なる型を取ることができます。以下に例を示します。
>>> l = [1, 2, 3, 4, 5]
>>> type(l)
list
[1, 2, 3, 4, 5] がリストで、このリストを l に代入した上で type() で型を確認しています。リストは [ ] で括り、各要素はコンマで区切ります。
リストの中の要素を取り出したいときは、次のようにします。
>>> l[2]
3
l[2] をインデクス指定と呼びます。リストの中の要素には番号がふられており、番号を指定することで書く要素にアクセスすることができます。注意すべきなのは、インデクスの番号は 0, 1, 2, 3…、というように、0 から始まることです。上記の例の場合、l[2] なので、左から三番目の要素、つまり 3 が指定されます。
インデクスには負の数も使うことができます。以下の例を見てみましょう。
>>> l[-1]
5
>>> l[-2]
4
負号を付けると、右から何番目かを指定することができます。ただし、左からかぞえるときは、0, 1, 2, 3…、と 0 から数え始めましたが、右から数えるときは、-1, -2, -3…、と-1から始まることに注意してください。上記の例では、l[-1] は一番右、l[-2] は右から2番めの要素を表すので、5, 4 が指定されます。
インデクスを使うと、何番目から何番目の要素、というようにリストの一部分を指定できます。具体例で見てみましょう。
>>> l
[1, 2, 3, 4, 5]
>>> l[2:4]
[3, 4]
最初の入力行では確認のためリスト l の内容を表示しています。二つ目の入力行で範囲の指定をしています。この場合、3番目から4番目までの要素が指定されます。スライスの構文は、一般的には次のように書くことができます。
スライス構文: l[start:stop:step]
最初の start が範囲の最初の要素、stop が終わりの要素、step が増加量を表しています。step は省略すると 1 として扱われます。ここで覚えておきたいのは、部分を取り出す始めの要素が左から n番目のとき、start=n-1 となる一方で、終わりの要素が左から n 番目とすると、stop=n となることです。(この点、しばしば勘違いしてエラーの原因になりますのでしっかり覚えておきましょう。)
なぜこのような一見わかりにくそうな仕様になっているかというと、stop - start が取り出す要素の個数になるからです。ここでは解りにくいと思う方もいるかもしれませんが、Pythonでは要素の個数が分かりやすい方がプログラミングがやりやすいのでこのような仕様になっています。
以下、もう少しスライスの具体例を見てみましょう。
>>> l[3:]
[4, 5]
>>> l[:3]
[1, 2, 3]
>>> l[::2]
[1, 3, 5]
最初の入力 l[3:] は、start=3 で、stop と step が省略されています。この場合、範囲の最後は元のリストの最後までとなり、step は上述の通り 1 となります。
二つ目の入力 l[:3] は同様に、start=0, stop=3, step=1 と同義です。
三つ目の入力 l[::2] は、start と stop が省略されていて、step=2 です。この場合、元のリストの最初の要素から一つ置きに順次要素を取り出すことになります。 ここに上げた例以外にも、スライスは負の数を使った範囲指定もできますが、それはまた追々説明することにします。次回は、リストの操作の基本事項をまとめる予定です。