リスト

Pythonは複数のデータをまとめておく仕組みとして「リスト」を備えている。異なる種類のデータを単一のリストにまとめておくこともできるし、リストにリストを含めてネスト構造にすることもできる。複数のデータをまとめておく方法として、リストはPythonで最もよく使われている仕組みの1つとされている。

今回も「The Python Tutorial」を試しながらPythonの使い方を試していってみよう。リストは複数の種類のデータを収めることができるが、通常は同じ種類のデータを保持する目的で使われている。チュートリアルに沿って作業を進めて、その機能を見てみよう。

リストの基本的な使い方

リストは[]で囲って作成する。中のデータはカンマ区切りで分けることができる。次の例であれば数字をデータとしてリストを作成している。

>>> squares = [1, 4, 9, 16, 25]
>>> squares
[1, 4, 9, 16, 25]
>>>

リストを作成して変数に代入した場合、リストの個々の要素に対しては配列のようなインデックスでアクセスすることができる。このインデックスは0から始まっており、1つずつインクリメントする仕組みになっている。文字列の場合と同じように、マイナスの値を指定すると後ろからの指定となる。「-1」が一番後ろのデータで、「-2」が一番後ろから1つ前の値、「-3」が一番後ろから2つ前の値という具合だ。

>>> squares = [1, 4, 9, 16, 25]
>>> squares[0]  # indexing returns the item
1
>>> squares[-1]
25
>>> squares[-3:]  # slicing returns a new list
[9, 16, 25]
>>> squares[:]
[1, 4, 9, 16, 25]
>>>

また、これも文字列の場合と同様にスライスを使うこともできる。「開始インデックス:終了インデックス」の形式で一部を取り出してアクセスすることができ、「:」の前後の指定が省略された場合には「一番最初と一番後ろ」という指定になる。

さらに、リストは「+」を使って結合処理を行うことも可能だ。次のように記述するとリストが結合されて新しいリストが生成されていることを確認できる。

>>> squares = [1, 4, 9, 16, 25]
>>> squares + [36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>>

ここまでの操作を見る限り、文字列とリストはかなり似ているように見える。だが、文字列はそれぞれのインデックスでアクセスする文字が読み込み専用になっているのに対し、リストでは代入が可能であるというのが大きな違いとなる。次のサンプルではリストに対してインデックス3でアクセスできる対象が後から別の値が代入されているし、「append()」を使うことでリストの最後に新しい値が追加されていることも確認できる。つまり、リストは変更不可能なデータではなく、自由に変更が可能な”入れ物”ということになる。

>>> cubes = [1, 8, 27, 65, 125]
>>> 4 ** 3  # the cube of 4 is 64, not 65!
64
>>> cubes[3] = 64  # replace the wrong value
>>> cubes
[1, 8, 27, 64, 125]
>>> cubes.append(216)  # add the cube of 6
>>> cubes.append(7 ** 3)  # and the cube of 7
>>> cubes
[1, 8, 27, 64, 125, 216, 343]
>>>

次のサンプルはリストの個々のデータを文字にしたものだ。処理の内容は文字列の操作に似ているが、データの書き換えができている点が文字列のときとは異なっている。

>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> letters
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> # replace some values
...
>>> letters[2:5] = ['C', 'D', 'E']
>>> letters
['a', 'b', 'C', 'D', 'E', 'f', 'g']
>>> # now remove them
...
>>> letters[2:5] = []
>>> letters
['a', 'b', 'f', 'g']
>>> # clear the list by replacing all the elements with an empty list
...
>>> letters[:] = []
>>> letters
[]
>>> letters = ['a', 'b', 'c', 'd']
>>> len(letters)
4
>>>

リストはデータとしてリストも持つことができる。次のようにインデックスを指定してアクセスすると、リストからリストが出てくることを確認できる。

>>> a = ['a', 'b', 'c']
>>> n = [1, 2, 3]
>>> x = [a, n]
>>> x
[['a', 'b', 'c'], [1, 2, 3]]
>>> x[0]
['a', 'b', 'c']
>>> x[0][1]
'b'
>>>

「リストの中のリスト」の中のデータにアクセスするには、「x[0][1]」のようにインデックスを続けて指定する。

最初のプログラミング

チュートリアルではここで最初のプログラミングの例としてフィボナッチ数列を出力するコードが掲載されている。次のようなコードで実行すると、whileで指定された数字以下のフィボナッチ数列が出力されることを確認できる。

>>> a, b = 0, 1
>>> while a < 10000:
...  print(a)
...  a, b = b, a+b
...
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
>>>

フィボナッチ数列は、プログラミング言語を学ぶ最初の段階で使われることが多い例題の1つだ。コーディングが簡単で、かつ、プログラミング言語の機能のエッセンス的な部分を多く含んでいる。

チュートリアルではこの短いサンプルコードにはいくつかの新しい機能が使われているとし、Pythonのコーディングについて説明している。取り上げられている主なポイントは次のとおり。

  • 「a, b = 0, 1」はマルチアサイン(multiple assignment)と呼ばれる書き方で、aには0が、bには1が代入される。最後の行にある「a, b = b, a+b」もマルチアサインで、この例はどのような式が評価されるかをわかりやすく示している。「a, b = b, a+b」といった記述では、まず=の右側の式がすべて評価されてから、その結果が左側に代入されている。フィボナッチ数列のサンプルはマルチアサインでどのように式が評価されるのかを示す良い例と言える
  • whileでは「a < 10」という条件が満たされている限り処理がループする。条件はフィボナッチ数列の場合のように不等号や等号でもよいし、0やそれ以外の値、リストなどでもよいとされている。Pythonでは0なら偽値、0以外なら真値として扱われる。リストなどの場合には長さが0の場合には偽値、それ以外の場合には真値となる
  • whileより後ろの2行分はインデントされている。Pythonではインデントがグルーピングの機能を果たしており、同じインデントであることが同じグループにあることを意味している
  • print()は関数の使用例


チュートリアルに掲載されているフィボナッチ数列を出力するための4行のサンプルは、Pythonのコーディングを示す良いサンプルになっている。最低限のコードのなかに多くのエッセンス的な機能が入っているし、実用的に機能するコードとしても興味深い。Pythonを実行したことがないなら、ぜひ自分で入力して試してもらいたいサンプルだ。

【参考資料】
The Python Tutorial