この記事ではPythonで複数のデータを順序付きで扱うためのデータ構造の1つであるリストについて学びましょう。他のプログラミング言語ではリストではなく配列と呼ぶこともあります。
目次
リストとは
まずはじめにリストがどのようなものなのかについてざっくりと知っておきましょう。
変数や定数が1つのデータを入れられる箱のようなものだとすると、リストは複数の中身を入れられる連続した箱のようなものです。
変数で2つの要素を扱おうとすると2つの変数名を用意する必要がありましたが、リストを使えば1つのリスト名で複数のデータをまとめて管理することができるわけです。
リストではインデックスと呼ばれる番号でリスト内の個々のデータを管理していて、リスト内の要素を個別に取り出して扱うこともできます。
インデックスの番号は0番から始まるため注意しましょう。
リストの要素はリスト名とインデックス番号で管理するため、並び順が必要なデータを管理するのに使われます。主な使いどころとしては次のようなものがあります。
- 学校の出席名簿や会社の社員名簿
- RPGゲームのパーティーキャラクターの並び順
- 選択肢を表示するWebフォーム
- エクセルなどCSVデータの処理
リストの作成
それでは実際に例を見ながらリストの使い方を覚えていきましょう。
学校のクラス名簿をデータで管理しようとした時に、変数で管理しようとすると次のようになります。
number_1 = "秋原" number_2 = "今井"
このように名簿を作った場合、クラス全員の名前を表示するためのコードは次のようになります。
print(number_1, number_2)
この書き方だとクラスの人数分の変数を定義する必要がありますし、表示する場合も全員分の変数名を書く必要があります。
しかしリストを使えばもっと簡単に書くことができます。
リスト名 = ["要素1", "要素2"]
リストを作成するにはこのように角括弧で囲んで要素をカンマで区切って記述します。
では先ほどのクラス名簿をリストで作成して出力してみましょう。
members = ["秋原", "今井"] print(members)
実行結果は次のようになります。
['秋原', '今井']
リストはこのように全体が角括弧で囲まれ、各要素がシングルクォーテーションで囲まれてカンマで区切られて出力されます。
リストには文字列だけでなく、数値や変数も代入できます。
実際に試してみましょう。
number_1 = "秋原" number_2 = "今井" members = [number_1, number_2] print(members)
実行結果は次のようになります。
['秋原', '今井']
ちゃんと変数に代入された値がリストとして表示されているのがわかります。
要素の取り出し
今度はリストの各要素を個別に取り出してみましょう。書き方は次のとおりです。
リスト名[インデックス番号]
実際に例を見てみましょう。
先ほどのリストから要素を個別に取り出して表示するコードは次のようになります。
members = ["秋原", "今井"] print(members[0]) print(members[1])
リストのインデックス番号は0番から始まります。
実行結果は次のとおりです。
秋原 今井
ちゃんとリストの0番目の要素と1番目の要素それぞれを取り出せているのがわかりますね。
リストに格納されている要素の個数を確認するにはlen関数を使います。
例えば先ほどのリストの個数を表示するには次のように記述します。
members = ["秋原", "今井"] print(len(members))
実行結果は次のようになります。
2
このリストには2個の要素が格納されていることがわかります。
ちなみにlen関数の由来は「長さ」を意味する「length」がら来ています。このように関数名は何らかの英単語やその省略形となっています。
関数は標準で用意されているものだけでもたくさんありますが、元の英単語とその意味を知っておくと覚えやすいです。
リストの基本操作
次は作成したリストに要素を追加したり、上書き、削除する方法をみていきましょう。
要素の追加
リストの末尾に要素を追加するにはappendメソッドを使います。
ここではメソッドは関数のようなものだと思っておいて下さい。詳細はオブジェクト指向の章で解説しますが、関数が単独で呼び出せるのに対し、変数や値に付けて呼び出すのがメソッドです。
関数名() # 関数 変数名.メソッド名() # メソッド
では、例として先ほどのリストに上田くんを追加してみましょう。コードは次のように記述します。
members = ["秋原", "今井"] members.append("上田") # リストの末尾に上田くんを追加 print(members) print(len(members))
実行結果は次のとおりです。
['秋原', '今井', '上田'] 3
リストの末尾に上田くんが追加され、リストの要素数が3になっているのがわかります。
要素の上書き
次はリストの要素を上書きしてみましょう。先ほどのコードの今井くんを飯田くんに変更するには次のように記述します。
members = ["秋原", "今井", "上田"] members[1] = "飯田" # リストの1番目の要素を上書き print(members) print(len(members))
リストの要素を上書きするにはリストのインデックス番号を指定して値を代入します。
実行結果を見てみましょう。
['秋原', '飯田', '上田'] 3
リストの1番目の要素の今井くんが飯田くんに書き変わっているのがわかります。
要素の削除
リストから特定の要素を削除するにはpopメソッドを使います。
例として先ほどのリストから今井くんを削除してみましょう。
members = ["秋原", "今井", "上田"] members.pop(1) # リストの1番目の要素を削除 print(members) print(len(members))
実行結果は次のようになります。
['秋原', '上田'] 2
リストから今井くんが削除され、リストの要素数が2個になっているのがわかります。
リストのソート
次はリスト要素の順序を一定の法則に従って並べ替える方法について見ていきましょう。
例えば次のようなリストがあったとします。
members = ["イイダ", "ウエダ", "アキハラ", "イマイ"]
このリストは学校のクラス名簿ですが並び順に法則性がありません。要素をあいうえお順に並び変えて表示してみましょう。
リストの要素を並べ替えるにはsorted関数を使います。
members = ["イイダ", "ウエダ", "アキハラ", "イマイ"] print(sorted(members))
実行結果は次のようになります。
['アキハラ', 'イイダ', 'イマイ', 'ウエダ']
このようにsorted関数をそのまま使うとリストの要素をあいうえお順や数字順に並べ替えることができます。
ちなみに「イイダ」と「イマイ」はどちらも1文字目が「イ」のため2文字目が参照されてこの順番に並び替えられています。
sorted関数は要素を並べ替えたリストを返すだけで、リストそのものを並べ替えるわけではありません。
リストそのものの並べ替えはsort関数で実行できますが、並べ替える前の状態に戻すことはできないため、確実に元のリストが不要な場合以外は推奨できません。
元のリストを残しつつ、並べ替えたリストを作りたい場合はsorted関数を使って新たにリストを作りましょう。
members = ["イイダ", "ウエダ", "アキハラ", "イマイ"] new_members = sorted(members) print(members) print(new_members)
実行結果は次のようになります。
['イイダ', 'ウエダ', 'アキハラ', 'イマイ'] ['アキハラ', 'イイダ', 'イマイ', 'ウエダ']
元のリストはそのままに、あいうえお順に並び替えた新たなリストを作ることができました。
リストを逆順に並べ替えたい場合はsorted関数のreverseパラメータに真偽値を渡してあげます。
実際に先ほどのリストを降順に並べ替えてみましょう。
members = ["イイダ", "ウエダ", "アキハラ", "イマイ"] print(sorted(members, reverse=True))
実行結果は次のようになります。
['ウエダ', 'イマイ', 'イイダ', 'アキハラ']
ちゃんとあいうえお順の逆順で並び替えることができました。
ではリストに漢字を混ぜた場合はどうなるでしょうか。元のように漢字のリストで試してみましょう。
members = ["飯田", "上田", "秋原", "今井"] print(sorted(members))
実行結果は次のようになります。
['上田', '今井', '秋原', '飯田']
あれれ~おかしいぞ~!!並び順は変更されましたが読み仮名順にはなっていないようです。
実はsorted関数はコンピュータの内部でテキストを管理している文字コードの順に並び替えいるのです。よくよく見るとこの場合は漢字の音読み順に並んでいるようですね。
ひらがな、カタカナ、漢字などの混ざったリストを作る場合には注意が必要です。
リストをループで処理
リストの作り方や操作方法がわかったところで、ループ処理とリストを組み合わせて使う方法について見ていきましょう。
例えばfor文を使ってリストの中の要素を全て表示するには次のように記述します。
for i in リスト名: # リストの中身をカウンタ変数iに順番に格納 print(i)
for文はデータの集まりから各データを1つずつ取り出してすべて処理するんでしたね。
つまりこのようにfor文の「くり返す範囲」にリストを指定してあげることで、リストの中身を順番に1つずつ取り出してi変数に格納してくれます。
では実際に先ほどのリストの中身をfor文を使って全て表示するコードを書いてみましょう。
members = ["秋原", "今井", "上田"] for i in members: print(i)
実行結果は次のようになります。
秋原 今井 上田
リストをそのまま出力したときは角括弧で囲まれてカンマで区切られていましたが、今回は要素を1つずつ取り出してprint関数で出力したため文字列として返されているのがわかります。
ではこの方法を使って名前の後に「くんが登校しました」と表示するプログラムを作ってみましょう。
members = ["秋原", "今井", "上田"] for name in members: print(name + "くんが登校しました")
実行結果は次のようになります。
秋原くんが登校しました 今井くんが登校しました 上田くんが登校しました
このようにfor文を使ってリストの要素を1つずつ取り出すことができれば、リストの要素それぞれに文字列を連結したり、要素が数値であれば計算して出力するといった処理を短く書くことができます。
要素とインデックス番号を両方取り出す
リストの要素と一緒にインデックス番号を両方とも取り出したい場合にはenumerate関数を使います。
for 変数1,変数2 in enumerate(リスト名): ここに処理を書く
変数1にインデックス番号が、変数2にリストの要素が順番に格納されます。
実際に使ってみましょう。例えば先ほどのリストの各要素の前にインデックス番号を付けて表示するには次のように記述します。
members = ["秋原", "今井", "上田"] for i,name in enumerate(members): print(str(i) + name)
インデックス番号iは数値型で格納されるので要素の文字列と連結するためにstr関数を使っています。
実行結果は次のようになります。
0秋原 1今井 2上田
リストのインデックス番号と要素を1つずつ順番に取り出して表示することができました。