Python入門 - リスト(list); 順序付きデータを複数まとめて管理することができるリストについて
本ページではPythonの入門コンテンツとして初学者向けにPythonにおけるリストについて説明します。
要約#
リスト ( list ) には複数のデータを格納することができる
リストにはどのようなデータ型も詰めることができる
リストにはインデックスを利用して各データにアクセスする
リストの要素は自由に追加・削除することができる
リストについて#
Pythonでは データを順序付けて格納するためのデータ構造としてリスト (list) が存在します。 他の言語では配列 (array) と呼ばれる構造体に近いものです。
具体的に見ていきましょう。
リストの作り方#
リストを作成するには 角カッコ [] を利用します。以下の例では単に空のリストを作成しています。
empty_list = []
type(empty_list)
# => <class 'list'>
上記は単なる空のリストですが、リストには複数のデータを入れることができます。実際に数値を幾つか入れてみます。何かデータの入ったリストを作成する場合は、単に [] の中にそのデータをカンマ ( , ) 区切りで入れていけばOKです。
int_list = [1, 2, 3, 4]
これで 1から4の整数が格納されたリストを作成することができました。
リストの中には異なるデータ型も詰めることができてしまいます。
mixed_list = [1, 0.48, '文字も入る', True, complex(1, 1)]
print(mixed_list)
# => [1, 0.48, '文字も入る', True, (1+1j)]
このようにリストは [] の中に入れたいデータを並べていけば作成することができます。
重要な用語として、 リストに格納した1つ1つのデータのことを要素 (element) と呼びます。 これはリストを構成する要素であるためこのような呼び方がされます。
リストのデータを読みだす#
さて、今のところリストの作成と print() による出力はできましたが、要素1つだけを読むといったことができておりません。これを実現するためには、インデックス (index) を利用したアクセスを実施します。
具体的に見ていきましょう。簡単のため整数だけで構成されたリストを作成していきます。
simple_list = [1, 2, 3, 4, 5, 6, 7, 8]
simple_list[0]
# => 1
simple_list[4]
# => 5
simple_list[-1]
# => 8
お分かりいただけたでしょうか。リストのお尻に角カッコ [] をつけてその中に数字を入れると、対応する要素を読み出すことができます。これがインデックスを利用したアクセスです。
インデックスとはリストの中のそれぞれの要素に自動的につけられた番号であり、これを指定することで要素1つを読みだしています。最初にリストとは「データを順序付けして格納」するデータ構造体と説明していましたが、これがまさに順序付です。各要素にはインデックス番号が付与されているためデータには順番が存在しています。
探している要素のインデックスは index() 関数を利用します。 対象のリストに .index() とつけて、カッコの中に探している要素の値を入れることでインデックスを取得することができます。これを利用してインデックスを調べてみます。
simple_list.index(1)
# => 0
simple_list.index(5)
# => 4
simple_list.index(8)
# => 7
上記から推測できる通り、 リストのインデックスは 0 から順番に正の整数の値が付与される形になっています。 simple_list の値とインデックスはすべて列挙すると以下のようになっています。
値 : 1 2 3 4 5 6 7 8
インデックス: 0 1 2 3 4 5 6 7
これを知ったうえで、先ほどのインデックスを利用したアクセスのコードを見ると納得できますね。
と言いたいところですが、先ほどのコードで一か所だけ -1 という不可解なインデックスを指定している人がいます。これは何でしょうか。
実は Python ではインデックスに負の値を指定することでリストの後ろからアクセスすることができるのです。ちょっと厄介なのが、こちらは -1 から始まるという点ですね。これだけややこしいです。
simple_list[-1]
# => 8
simple_list[-2]
# => 7
simple_list[-5]
# => 4
これも加味して simple_list のインデックス対応表は以下のようになります。
値 : 1 2 3 4 5 6 7 8
正のインデックス: 0 1 2 3 4 5 6 7
負のインデックス: -8 -7 -6 -5 -4 -3 -2 -1
リストの長さを取得する#
インデックスによるデータの読み出し時に、存在しないインデックスを入れると範囲外アクセスということでエラーが出力されます。
a[9]
# => 以下が出力される
# Traceback (most recent call last):
# File "<stdin>", line 1, in <module>
# IndexError: list index out of range
範囲外にアクセスすることを防ぐためには事前にインデックスに指定する値をチェックしておく必要があります[1] 。リストの長さより大きな値を指定できないようにチェックする方法がここでは利用できます。
リストの長さは len() という関数を利用することでチェックできます。 len() 関数は与えられたデータの長さをチェックする関数です[2] 。ここでは len() 関数の中に調べたいリストを入れて実行します。 index() 関数とは呼び出し方が異なるのでご注意ください。
len(simple_list)
チェック自体には if 文を利用する必要があります。 if 文自体は次ページ以降で解説予定ですが、具体的には以下のような形になります。説明はともかく、コピーして実行してみるとエラーが回避され先ほどの"Traceback ..." といった文字列が表示されなくなることがわかるかと思います。
idx = 9
if idx < len(simple_list):
print(simple_list[idx])
else:
print('Indexが大きすぎるよ')
リストの要素を上書きする#
リストの中から要素を読み出すことができましたが、リストの要素を通常の変数のように書き換えることも可能です。
変数に値を入れるのと同じように、インデックスでアクセスした値を左辺に持ってきて値を代入するだけです。具体的には下記です。
simple_list = [1, 2, 3, 4, 5, 6, 7, 8]
# index=1 の個所を書き換える
simple_list[1] = 10000
print(simple_list)
# => [1, 10000, 3, 4, 5, 6, 7, 8]
リストの要素を追加する#
また、リストに対して要素を追加することも可能です。要素の追加には append() 関数を利用します。
index() 関数と同じような使い方で、カッコの中には要素として追加したい値を入れます。この関数はリストの末尾にデータを追加します。具体的には以下です。
simple_list = [1, 2, 3, 4, 5, 6, 7, 8]
# 末尾に 9 を加える
simple_list.append(9)
print(simple_list)
# => [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 長さもちゃんと増えています
print(len(simple_list))
# => 9
末尾ではなく、色々な場所にデータを追加したい、ということもあるかと思います。その場合には insert() 関数を利用します。
insert() 関数はカッコの中に値を2つ入れる必要があります。1つ目の値は要素を挿入したいインデックス、2つ目の値に挿入したいデータを指定します。具体的には以下です。
simple_list = [1, 2, 3, 4, 5, 6, 7, 8]
# 1の後に 1.5 を加える = インデックス番号1の場所に1.5を入れる
simple_list.insert(1, 1.5)
print(simple_list)
# => [1, 1.5 2, 3, 4, 5, 6, 7, 8]
リストの要素を削除する#
リストの要素を削除する方法は3種類あります。
末尾から要素を削除する pop()#
リストの末尾のデータを削除する方法として pop() 関数が存在します。 この関数はカッコの中に特に何も入れる必要がありません。
この関数はただ単に削除するだけではなく、末尾の要素を返してくれる関数でもあります。削除というよりは、取り出す、といった方がイメージに近いかもしれません。
simple_list = [1, 2, 3, 4, 5, 6, 7, 8]
# pop() による末尾削除と値の取得
popped = simple_list.pop()
# pop() により末尾の要素が削除されている
print(simple_list)
# => [1, 2, 3, 4, 5, 6, 7]
# pop() により末尾の要素が取り出されている
print(popped)
# => 8
任意の要素を削除する remove()#
リストの中の任意の要素を削除する方法として remove() 関数があります。この関数は削除する対象の要素の値を知っている必要があります。
remove() 関数の中に削除対象の値を入れることでその値を持つ要素が削除されます。同一の値を持つ複数の要素が存在する場合、最も先頭に近い要素のみが削除されることに注意してください。
# 末尾に重複した値のデータを追加しています
simple_list = [1, 2, 3, 4, 5, 6, 7, 8 ,1]
# remove() により 1 という値を持つ要素を削除
simple_list.remove(1)
# remove() により先頭に近い 1 が削除されているが、末尾は残っている
print(simple_list)
# => [2, 3, 4, 5, 6, 7, 8, 1]
# もう一度 remove() により 1 という値を持つ要素を削除
simple_list.remove(1)
# 末尾も削除される
print(simple_list)
# => [2, 3, 4, 5, 6, 7, 8]
リスト内に存在しない値を指定すると ValueError というエラーが発生します。
すべての要素を削除する clear()#
リストを完全に削除するための関数として clear() があります。カッコの中には何も入れる必要はありません。
simple_list = [1, 2, 3, 4, 5, 6, 7, 8 ,1]
# すべて削除
simple_list.clear()
print(simple_list)
# => []
シーケンス型について#
端的に言うと、 list と同じように扱えるデータ型 のことです。 扱い方が list と同じであるので一緒に紹介させてください。
シーケンス型という分類について#
list は シーケンス (sequence) 型 と呼ばれるオブジェクトで、実は同じくシーケンス型のデータが今まで解説したデータ型の中に存在します。それは str です。このほかにも tuple (タプル) というデータ型や range オブジェクトといったデータ形式も存在します。
シーケンス型は以下のようなものが該当します。
list
tuple
ragne
str などの「文字列シーケンス」と呼ばれるデータ
シーケンス型とはなんなのか?#
シーケンス型とは、整数により各要素がインデックスされておりインデックスを利用することでアクセスができるような順序付きのデータ構造体です。
要するに list と同じように扱えるデータ形式のこと です。
具体例#
tupleの例#
tuple は読み取り専用の list です。 list とは異なり丸カッコ () によってデータを生成します。
何かしらの関数を呼び出した際に戻ってくるデータや、関数呼び出し時の引数として利用される場合があります。
tuple_data = (1, 2)
print(tuple_data[0])
# => 1
print(len(tuple_data))
# => 2
rangeの例#
range はその名の通り範囲を示すデータ型です。後で繰り返し処理を学ぶ際に再登場します。
range オブジェクトは range() というコンストラクタを利用してデータを生成します。コンストラクタの中には整数を入れることができ、その整数の値までの数列を生成します[3] 。本当はもう少し細かい指定方法があるのですが、ここでは省きます。
range_data = range(10)
print(range_data[5])
# => 5
print(len(range_data))
# => 10
range() の中身を確認するには list に変換する方式がもっとも簡単です。下記のように 0から9 を含んだ要素数 10 の list と同等のデータが生成されていることがわかります。
range_data = range(10)
print(list(range_data))
# => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
strの例#
str も実は同じようにインデックスを利用したアクセスをすることができます。ただし、 list でできたデータの代入はできません。
string_data = 'これはstringのデータです'
print(string_data[5])
# => r
print(len(string_data))
# => 15
string_data[5] = 'R'
# => これは TypeErrorとなる
まとめ#
本ページではリスト (list) のデータ形式とデータを読み書きする方法、そして list に似た構造を持つデータ形式について解説しました。
list やシーケンス型に関するすべての機能を紹介しきれているわけではなく、ここでは入門コースで利用する必要最低限の機能のみを紹介しています。
もし、詳細な機能の全貌を確認したい場合には Python公式のリストについてのリファレンス などをご確認ください。