【プログラミング】3.8 リスト

プログラミング

日常生活の中でたくさんの情報を管理する場合には、表やリストにして扱うことがありますね。プログラムの世界でも、同じようにデータをひとかたまりにして扱う仕組みがあります。今回はリストを見ていきましょう。

リストとは
これまで、変数を使って数値などを1つずつ保持することをしてきました。そしてそれらの値を対象とした計算もできました。
例えば、3つの数があってその平均値を求めたいとします。
a=2
b=6
c=4
avg=(a+b+c)/3
ここで、平均値を求めたい数が4つになったらどうでしょうか。変数dを用いてちょっとプログラムを書き換えればよいですね。でも、さらに数が増えたら…。
一般的に、プログラムで扱うデータの数はあらかじめわからないことが多いです。そんなときでも柔軟にデータを扱えるとよいですね。そこで登場するのがリストです。
リストはプログラム言語によっては配列などとも言われ、基本的なものであれば多くのプログラム言語に備わっている機能です。それだけ必要性が高いのですね。しかし、どんなデータを扱えるかや、どんな機能があるかなどの使い勝手や性能などは、それぞれ異なります。
さて、pythonにおけるリストを見ていきましょう。
リストは、[]の中にカンマ区切りでデータを書き並べていくことで定義できます。
以下は、整数を要素に持つリストaを定義した例です。中に入るデータのことを要素といいます。
a=[2, 6, 4, 3, 2, 4]
そして、要素にアクセスするためには、カッコでインデックス(添え字;そえじ)を指定します。インデックスは、先頭の要素を0番目、次のデータを1番目というように、整数で順番に割り振った値のことです。つまり、リストaの何番目という形で呼び出すのです。注意するのは、インデックスが0から始まるということです。余談ですが、プログラム言語によってはインデックスが0から始まるもの、1から始まるものがあるので、ちょっと紛らわしいと思うこともあります。
このように、いくつかのデータをまとめて扱い、インデックスを使って参照できることがリストの特徴です。
リストに対する操作
リストにはいろいろな操作を行うことができます。その一部を見ていきましょう。
【要素の追加】
リストの末尾に要素を追加するにはappend()を使います。このように、リストにはあとから要素を追加できることが大きなメリットです。
末尾ではなく、先頭や途中に挿入することもできます。insert()を使い、引数には挿入する位置(インデックス)と、挿入する要素を指定します。
【要素の削除】
逆に、不要な要素を削除するには del を使います。del は変数を削除するものですが、リストの要素に対しても使うことができます。
【リストの連結】
2つのリストを連結して新たなリストを作ることができます。二項演算子の+を使います。
【リストの長さ】
リストの長さはlen()で知ることができます。
なお、リストに何も要素が入っていない、つまり空っぽのリストの場合は長さ0になります。
【リストの最大最小】
リストに含まれる要素のうち最大のもの、最小のものを求めるには、max()とmin()を使います。
要素が数値である場合に限らず、要素が文字列であっても、一定のルールのもとで大小関係が判断され、最大最小の要素が返るようになっています。
【リストの合計】
数値からなるリストの合計値を求める場合にはsum()を使います。
【要素が含まれるかの判定】
指定した要素がリストに含まれるかを調べるには in を使います。含まれていれば真を返します。
【要素の代入】
リストの要素に代入を行うことで置き換えることもできます。
反復
少し前に反復処理を扱いましたが、その時はwhile文を使った反復処理を書きました。ここでは、リストを扱うのに便利なfor文を見ていきましょう。
リストで複数のデータを扱っていると、それぞれのデータに対して何らかの処理をしたいというケースがとてもよく出てきます。そんなときにはfor文を使います。以下の構文で、リストの各要素が順番にループ変数に代入されて、指定した処理が行われます。
図 for文の構文
リストに入っている数を二乗して表示していくプログラムの例です。
range
リストで数字を扱っていると、連続した数字を要素に持つリストが必要になることがあります。例えば、0から10までの数字のリストなどです。こうした規則性のある数字の列を作る方法としてrange()があります。
range()はリストと同じシーケンス型に分類されるもので、規則性を持った数字の列を作り出すことができます。これはfor文などにおいてはリストと同じように扱うことができ、さらに、必要なときにはリストに変換することもできます。
0<m<nの整数を引数に指定した場合、range()は以下のように機能します。
range(n) # 0以上、n未満の整数の範囲
range(m, n) # m以上、n未満の整数の範囲
range(m, n, k) # m以上、n未満であり、kごとの整数の範囲
for文でその挙動を確かめてみましょう。

for文で処理を10回繰り返したい!なんて場合には、range(10)を使えば良いですね。以前に紹介したwhile文とループ変数を組み合わせるよりずっと簡単に書くことができます。

なお、range()で作られた数の範囲は、list()を使うことでリストに変換することができます。

 

内包表記

range()で作ることができるのは一定間隔の数の列でした。これを応用することで、奇数の列や偶数の列、3の倍数の列などを作ることができます。ちょっと数学的にいうと等差数列になる列ですね。

例えば奇数の列は、初項が1、公差が2の等差数列であり、その一般項は

an = 1 + 2n

となります。なお、ここではn=0,1,2,… であり、初項はn=0であるとします。これは、

list( range(1, 10, 2) )

などとして作ることができます。

それでは、初項が1、公比が2の等比数列となるとどうでしょうか。

こうしたリストを作るときには内包表記という手法が使えます。これは、リストとfor文の組み合わせのようなもので、以下のように記述します。

図 内包表記の書き方

リストから要素を1つずつ取り出してループするところはこれまで見てきたfor文と同じです。内包表記では、取り出した要素を用いた式を評価し、その内容が新しいリストの要素となるのです。

先ほどの等差数列の例を見てみましょう。

式の部分には 1+2*i とあります。これは先ほどの等差数列の一般項ですね。

つまり、range(10)で作り出した 0,1,2,3,… という整数列を添え字とした一般項を計算し、その結果からなるリストを作っていることになります。

この仕組みを使って等比数列を作ってみましょう。

式の部分が 1*2**i になっています。これは等比数列の一般項です。なお、pythonにおけるべき乗の記号は ** です。

内包表記は、数値に限らず文字列など他の型でも使うことができます。

文字列を対象とした例を見てみましょう。

これは、文字列のリストの内容を大文字化したリストを作るものです。

また、次の例は、数値を書式化した文字列のリストを作るものです。

 

例1 平均値

冒頭に示した平均値を計算する処理をリストを使って作ってみましょう。

numbers = []
x = int(input("数字を入力してください"))
numbers.append(x)
while x != 0:
    x = int(input("数字を入力してください。終わるときは0を入力してください"))
    if x != 0:
        numbers.append(x)
avg = sum(numbers) / len(numbers)
print("平均値", avg)

入力を受け付ける処理は以前にやったときと同じものです。入力された値はリストに追加していきます。0を入力するとデータの終わりとみなしています。最後に、sumで合計を求め、lenで求めたデータ数で割ることで平均値を求めています。

それでは実行してみましょう。

 

例2 カンマ区切りデータ

別の例として、カンマ区切りの数値データを読み込んで合計値を求める例です。

カンマ区切りとはその名前のとおり、カンマで区切られた数値が並んでいるデータ形式です。

12,34,56,78

例 カンマ区切りデータ

この各数値を合計する処理は以下のように作ることができます。

ここでは、カンマ区切りデータとして1行のテキストがあったとして、これをカンマで分解してリストにし、それを内包表記で数値にし、さらにsumで合計しています。

まとめ
  • リストにより、複数のデータを1つの列として扱うことができる。
  • リストにはいろいろな操作が準備されている。
  • for文により、リストの各要素に対して処理を行うことができる。
  • range()により規則性のある数字の列を作ることができ、これはリストと似た性質がある
  • 内包表記により、リストに対する演算の結果からなるリストを作ることができる。
  • リストはとにかく奥が深い。

 

 

 

コメント

タイトルとURLをコピーしました