概要
リストを使うことで、複数のデータをひとまとまりに扱うことができます。
# リストの定義
list1 = [1, 2, 3, 4, 5]
list2 = ["ab", "cd", "ef", "gh", "ij"]
# 要素の参照
x1 = list1[1]
# 要素の追加
list2.append("kl")
# 要素の削除
del list1[0]
list1.clear()
リストとは?リストを使うメリットは?
リストとは何か
リストはデータ構造の一種です。複数のデータをひとまとまりに扱うために使用されます。
リストの中の、一つ一つのデータを「要素」と呼びます。
リストは次のような形式で書きます。0個以上の要素を[]の中にコンマ(,)区切りで書くことで、リストとして扱われます。
[要素, 要素, ...]
要素には順番があります。一番左の要素が最初、一番右の要素が最後です。
例えば、1から10までの整数を格納したリストは、次のように書きます。
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
リストを使うメリット
リストを使うことで、プログラムをスッキリ書くことができ(可読性の向上)、仕様変更に強くなります(保守性の向上)。
まずは例を見てみましょう。リストを使わずに複数のデータを扱おうとして、次のようにプログラムを作ったとします。
# 5人の身長の平均を求める
h1 = 160.1
h2 = 156.3
h3 = 155.3
h4 = 171.2
h5 = 163.0
ave = (h1 + h2 + h3 + h4 + h5) / 5 # 161.18
変数を5つ定義すれば良いですね。変数って何?という方は、以下の記事をご覧ください。
しかし、リストを使わず、変数を用いた方法だと、以下のような問題があります。
- 大量のデータを扱うのに向いていません。例えば、500人分の身長データを扱う場合は、変数を500個定義する必要があり、コードを書くのも読むのも大変です。
- 要素数の変更で修正する箇所が多くなります。例えば、人数が5人から6人に増えた場合、次のような修正が必要です。処理が複雑になればなるほど、修正箇所を特定するのは困難になります。
- 変数h6の追加
- aveの計算式にh6を追加
- aveの分母を5から6に変更
そこで、上記のプログラムを、リストを使って書き換えてみます。
# 5人の身長の平均を求める
h_list = [160.1, 156.3, 155.3, 171.2, 163.0]
ave = sum(h_list) / len(h_list) # 161.18
sum(h_list)は身長の合計、len(h_list)はh_listの要素数です。
2つのプログラムを見比べてみると、リストを使った方が、次の利点があることがわかります。
- データを格納する変数は1つで良くなります。
(ちなみに「変数は一つだが、もし500人分の身長を扱うなら、その分コードも多くなるじゃないか」と言われれば、確かにそうです。しかし、実際にはデータをコードに直接書くことはあまりなく、外部ファイルやデータベースからリストとして値を取り出すことが多いので、問題にはなりません。) - 人数が5人から変更になっても、h_listに要素を追加するだけで修正が完了します。
今挙げたメリットはほんの一例で、リストを用いると他にも様々な恩恵が得られます。
使用方法
リストの使い方を見ていきましょう。
初期化
既に述べたように、[]で囲んでリストを初期化することが出来ます。
list1 = [1, 2, 3, 4, 5]
連続データを作る場合は、range関数を使って定義することもできます。range関数の返り値はrangeオブジェクトなので、list関数でlistに変換します。
list2 = list(range(1, 6)) # [1, 2, 3, 4, 5]
同じ値で初期化する場合は、アスタリスク(*)を用います。
list3 = [0] * 10 # [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
参照
1つの要素を参照
リストの要素を参照するときは、次の形式を用います。
リスト変数[添え字]
リストの各要素の番号を添え字と言います。最初の要素の添え字は「0」です。
例えば、リスト[10, 20, 30, 40, 50]で、要素「10」の添え字は「0」、要素「50」の添え字は「4」です。
具体例を見てみましょう。
list1 = [10, 20, 30, 40, 50]
x = list1[0] # xに10が代入される
y = list1[2] # yに30が代入される
z = list1[4] # zに50が代入される
添え字を使って、リストの特定の要素を変更することができます。
list1 = [10, 20, 30, 40, 50]
list1[1] = 60 # 20を60に変更
print(list1) # [10, 60, 30, 40, 50]
添字を-nとすることで、右からn番目の要素を参照することができます。このとき、最後の要素の添え字は-1です。(これがとても便利です!)
例えば、先ほどと同様のリスト[10, 20, 30, 40, 50]で、右から3番目の要素「30」の添え字は-3です。
list1 = [10, 20, 30, 40, 50]
x = list1[-3] # xに30が代入される
要素と添え字の対応を表にまとめると、以下のようになります。
要素 | 10 | 20 | 30 | 40 | 50 |
添え字(正) | 0 | 1 | 2 | 3 | 4 |
添え字(負) | -5 | -4 | -3 | -2 | -1 |
範囲を指定して参照(スライス)
また、以下の形式で、リストの範囲を指定することも出来ます。この操作をスライスと呼びます。
リスト変数[開始位置の添え字:終了位置の添え字]
ここで、終了位置の添え字の要素は含まれないことに注意してください。以下に使用例を示します。
list1 = [1, 2, 3, 4, 5]
sub_list = list1[1:4]
print(sub_list) # [2, 3, 4]
for文を用いた要素の取り出し
リストをfor文で使用すると、要素を一つずつ取り出すことができます。
以下の例ではfor文とif文を使用していますが、分からない方は以下を参照してください。
list1 = [1, 2, 3, 4, 5]
for i in list1:
if i % 2 == 0:
print(str(i) + "は偶数です")
else:
print(str(i) + "は奇数です")
実行すると、以下のような出力になります。
1は奇数です
2は偶数です
3は奇数です
4は偶数です
5は奇数です
要素の追加
append関数を用いて、リストの最後に要素を追加することができます。
list1 = [1, 2, 3, 4, 5]
list1.append(6)
print(list1) # [1, 2, 3, 4, 5, 6]
insert関数を用いると、リストの任意の位置に要素を追加することが出来ます。第一引数に追加する位置、第二引数に追加する値を指定します。
list1 = [1, 2, 3, 4, 5]
list1.insert(2, 10)
print(list1) # [1, 2, 10, 3, 4, 5]
要素の削除
del文を用いて、リストの要素を削除することが出来ます。スライスで指定した範囲を削除することもできます。
# 添え字2を削除
list1 = [1, 2, 3, 4, 5]
del list1[2]
print(list1) # [1, 2, 4, 5]
# 添え字1〜3を削除
list2 = [1, 2, 3, 4, 5]
del list2[1:4]
print(list2) # [1, 5]
練習問題
問題を解いて知識を定着させましょう。
リストの定義
1から20までの連続した整数20個を格納したリスト([1, 2, …, 19, 20])を、変数list1として定義してください。
list1 = list(range(1, 21))
スライス
先程定義したlist1から、前半10個と後半10個の要素を切り出し、それぞれ変数first_half、latter_halfに代入してください。
first_half = list1[0:10]
latter_half = list1[10:20]
リストとfor文
for文を用いて、先程定義したlatter_halfのうち3の倍数の数の合計を計算して、表示してください。ちなみに答えは45(= 12 + 15 + 18)です。
ans = 0
for i in latter_half:
if i % 3 == 0:
ans += i
print(ans)