リストとは
リスト(list)は、Pythonで使える特別なデータの種類(データ型)のひとつです。複数のデータを順番に並べて、その並びを処理する(読む、書く、編集する)のに使います。例えば、以下のようなデータの並びを使いたいとしましょう。曜日の名前の並びです。
Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
これと同じ構造のデータをPythonで表現するには以下のようにします。
daysOfWeek = [ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday" ]
このように、データをカンマ(,)で区切って並べ、データの並びをカギかっこ([
と]
)で囲みます。ここでは7個の文字データが並ぶリストを作り、そのリストを「daysOfWeek」という名前の変数(variable)に入れています。また上の例のように、複数の行を使ってリストに入れるデータを並べることができます。もちろん1行でリストを作っても問題ありません。
リスト内のデータをひとつづつ読む
最も典型的な(よくある)リストの使い方は、リストの中のデータをひとつづつ順番に読んで、その個々のデータを使って何かをすることです。例えば、上記のリストの中のデータ(曜日の名前)をひとつづつ順番に読んで、それをShellにプリントするとします。これをやるプログラムは次のようになります。
for day in daysOfWeek:
print(day)
これは、Pythonのキーワードfor
を使ったループです。「forループ」といい、くり返し作業をやる定番の方法です。forから始まる先頭行は「リストdaysOfWeek
に入っている各データ(曜日)を変数day
で表す」と理解します。そしてループは次のように実行されていきます。
- ループを最初に実行するときには、リスト
daysOfWeek
に入っている最初のデータ(”Monday”)を変数day
に入れて、ループ内のプログラムを実行する。つまり、print(day)
の部分では、”Monday”をShellにプリントする。
- ループを2回目に実行するときには、リスト
daysOfWeek
に入っている2番目のデータ(”Tuesday”)を変数day
に入れて、ループ内のプログラムを実行する。つまり、print(day)
の部分では、”Tuesday”をShellにプリントする。
同様に、ループの3回目には”Wednesday”、4回目には”Thursday”がプリントされます。リストdaysOfWeek
には7つのデータ(曜日)が入っているのでループは7回実行されます。つまり、”Monday”から”Sunday”までの7つの曜日が順番にプリントされます。
インデックスから値を検索する
リスト内の各データには「通し番号」が自動的に割り当てられます。この通し番号のことを「インデックス」といいます。インデックスは0から始まる整数値です。リスト内の最初のデータにインデックスの0、次のデータにインデックスの1、その次のデータにインデックスの2。。。というふうに割り当てられます。上記の例では、”Monday”のインデックスは0、”Tuesday”のインデックスは1、”Wednesday”のインデックスは2になります。
インデックス | データ |
---|---|
0 | “Monday” |
1 | “Tuesday” |
2 | “Wednesday” |
3 | “Thursday” |
4 | “Friday” |
5 | “Saturday” |
6 | “Sunday” |
リストの最も基本的な使い方は、インデックスからそれに対応するデータを得る(検索する)ことです。上記の例を使うと、以下のようにします。
d = daysOfWeek[0]
print(d)
daysOfWeek[0]の部分で、リストdaysOfWeekの中からインデックス0を探し、それに対応するデータを返します。つまり”Monday”が返され、それがprint()でシェルに表示されます。もしリストの中に存在しないインデックスを使うと、エラーになります。例えば、
d = daysOfWeek[7]
とすると、「IndexError: list index out of range」というエラーメッセージがシェルに表示されます。これは「7というインデックスは存在しない」という意味です(上記の例ではインデックスは0から6までなので)。
新しいデータを追加する
既存のリストに新規データを追加するには、以下のようにします。
daysOfWeek = [ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday"]
daysOfWeek.append("One more day!")
このようにappend()という関数を使うと、新規データをリストの最後に追加します。この例では、daysOfWeekというリストは以下のように更新されます。
[ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday", "One more day!" ]
新規データをリストの最後に追加するのではなく、ある特定の場所に追加(挿入)するには、insert()という関数を使って挿入箇所をインデックスで指定します。
daysOfWeek = [ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday" ]
daysOfWeek.insert(0, "One more day!")
このように、insert()には、挿入箇所(インデックス)と新規データを渡します。この例では、”One more day!”という新規データをインデックス0として(つまり最初のデータとして)挿入します。そのインデックス以降のデータはひとつづつ後ろにずらされます。したがって、daysOfWeekというリストは以下のように更新されます。
[ "One more day!", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday" ]
リストの中に何個データが入っているかを調べるには、以下のように関数len()を使います。
daysOfWeek = [ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday" ]
len(daysOfWeek)
この例では、len()は7を返します。
リストの中のデータを変更する
リスト内のデータを変更するには、以下のようにします。
daysOfWeek = [ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday" ]
daysOfWeek[6] = "Sun"
ここでは、インデックス6のデータを”Sun”に変更しています。つまり、元々の”Sunday”が”Sun”に置き換わります。したがって、daysOfWeekというリストは以下のように更新されます。
[ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sun" ]
リストの中のデータを削除する
インデックスを使ってリスト内のデータを削除するには以下のようにします。
daysOfWeek = [ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday" ]
del daysOfWeek[0]
ここでは、インデックス0のデータ(つまり最初のデータ”Monday”)が削除されます。削除後、残ったデータのインデックスは適宜ずらされます。例えば、元々インデックス1だったデータはインデックス0に、元々インデックス2だったデータインデックス1になります。
インデックス | データ |
---|---|
0 | “Tuesday” |
1 | “Wednesday” |
2 | “Thursday” |
3 | “Friday” |
4 | “Saturday” |
5 | “Sunday” |
削除したいデータを直接指定して削除することもできます。
daysOfWeek = [ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday" ]
daysOfWeek.remove("Monday")
ここでは”Monday”が削除されます。削除後、残ったデータのインデックスは適宜ずらされます。例えば、元々インデックス1だったデータはインデックス0に、元々インデックス2だったデータインデックス1になります。
リスト内のデータを全て削除するには以下のようにします。
daysOfWeek = [ "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday", "Sunday" ]
daysOfWeek.clear()