こんにちは、ナナです。
ここからはPythonがサポートする、様々なデータ管理構造のオブジェクトを紹介しましょう。
最初の第1弾は『リスト』と呼ばれるオブジェクトです。
『リスト』は連続した情報を管理するデータ構造を持ち、データの追加・変更・削除といったことが柔軟にできる構造になっています。
他の言語でいうところの「配列」のデータ構造に似たものですが、『リスト』は配列よりも柔軟性のある「パワーアップした配列」といったイメージを持つとよいでしょう。
本記事では次の疑問点を解消する内容となっています。
では、『リスト』の構造の基本的な扱い方について学んでいきましょう。
『リスト』のデータ構造と定義方法
師匠!『リスト』が今日のテーマですね。C言語入門編では出てこない言葉ですね。Pythonならではの機能ってことでしょうか?
C言語でいうところの『配列』に似たものが、Pythonの『リスト』になるね。『リスト』は『配列』よりも、もっと高機能なものになっているんだよ。
どんな機能を持っているかを紹介しようね。
『リスト』は、連続的な複数の情報を管理することができる『オブジェクト』です。定義方法とイメージを示しましょう。
リストオブジェクトの定義方法
リストオブジェクトの定義方法は、次の書式で記述します。
リストオブジェクトの定義の書式
変数名 = [値1, 値2, 値3, ・・・]
定義例
num_list = [10, 20, 30]
animal_list = [“象”, “虎”, “ネコ”, “キリン”]
具体的にプログラムで示しましょう。次のように『リスト』を定義することができます。
# リストオブジェクトの定義
num_list = [10, 20, 30]
animal_list = ["象", "虎", "ネコ", "キリン"]
# リスト内容の画面表示
print(num_list)
print(animal_list)
『リスト』を参照する変数をprint関数の引数で指定すると、リスト内容の全てを表示することができます。
[10, 20, 30]
['象', '虎', 'ネコ', 'キリン']
リストオブジェクトの構造は、次のようになっています。
変数「num_list」は、リストオブジェクトへの参照を管理することになります。
リスト定義時の初期値の数で要素数が決まります。
デバッガを使ったリスト要素の確認方法
リスト要素の内容は、デバッガを使うことで簡単に確認することができます。
要素のインデックス番号に対する「データ型」と「値」が一覧化されているのがわかりますね。
リストの要素数の取得方法
リストの「要素数」を取得する簡単な方法があります。それは、len関数を使用することです。
リストの要素数の取得方法
len(リストオブジェクト)
len(リストを参照する変数名)
使用例
num = len([10, 20, 30])
num = len(num_list)
実際のプログラムでは、len関数を次のように呼び出します。
# リスト変数の定義
num_list = [10, 20, 30]
animal_list = ["象", "虎", "ネコ", "キリン"]
# リスト要素数の表示
print(len(num_list))
print(len(animal_list))
3
4
要素数を利用することで反復範囲を知ることができます。この取得方法は覚えておきましょう!
「len」とは「length:長さ」のことです。この関数はあらかじめ用意されているので、いつでも呼び出すことができます。
『リスト』要素が参照するオブジェクトの読み出しと変更
『リスト』の定義方法はC言語の『配列』と似ていますね。『リスト』で作成した要素の値を見たり変更したりする方法はどうやって行うんですか?
『リスト』を定義しただけでは意味がないですよね。それでは、『リスト』の値を読み出したり、変更したりする方法を学びましょう。
これもC言語とほとんど変わりませんよ!
リストの要素にアクセスする方法を学びましょう。
『インデックス番号』と呼ばれる数値を利用して、リスト要素にアクセスします。
インデックス番号とは
『インデックス番号』とは、リスト要素にアクセスするための番号です。
インデックス番号の大事な特徴は、[0]から始まり[要素数-1]までの範囲の番号であることです。
範囲外の番号を指定することは決してあってはなりません。扱うときは注意が必要です。
プログラム次第で簡単に範囲外の番号になってしまいます。扱うときは本当に注意が必要ですよ。
インデックスを利用したリスト要素の読み出し方法
リスト要素を読み出ししたければ、次のようにインデックス番号を使ってアクセスします。
リスト要素の読み出し方法
リスト変数名[インデックス番号]
使用例
num = num_list[0]
それでは、リスト要素の値を画面に表示してみましょう。プログラムの実行結果も示します。
# リスト変数の定義
num_list = [10, 20, 30]
print(num_list[0]) # 要素[0]番目
print(num_list[1]) # 要素[1]番目
print(num_list[2]) # 要素[2]番目
10
20
30
このように、リスト変数名に[]とインデックス番号を使って要素を読み出します。
C言語を知っている人は配列を同じですね。他の言語でも、おおよそこの方法で配列やリストの要素を参照できます。
インデックスを利用したリスト要素の変更方法
リスト要素の参照先オブジェクトを変更したければ、「インデックス番号」を使用してオブジェクトを代入することで可能です。
# リスト変数の定義
num_list = [10, 20, 30]
num_list[0] = 40 # 要素[0]番目を変更
num_list[1] = 50 # 要素[1]番目を変更
num_list[2] = 60 # 要素[2]番目を変更
print(num_list)
[40, 50, 60]
「インデックス番号」を使って参照先のオブジェクトを変更することができますね。
このようにリストオブジェクトは生成後に情報を書き換えることができます。つまり、「mutable(変更可能)」なオブジェクトということです。
整数型や文字列型は「immutable(変更不可)」なオブジェクトでしたね。リストオブジェクトは「mutable(変更可能)」なんです。
反復処理によるリスト要素へのアクセス方法
リストは連続した情報ってことは、やっぱり反復処理とセットで使うってことですよね?『ループカウンタ』を使ってアクセスするんですか?
『リスト』を反復処理でアクセスする方法はいくつか書き方があります。紹介しましょうね。
リスト要素を反復処理で読み出ししたいとき
リスト要素を順に読み出したいときは、range関数の代わりにリストを指定することができます。
num_list = [10, 20, 30]
# リスト要素を順に表示
for num in num_list:
print(num)
10
20
30
このようにすると、リスト要素であるオブジェクトの参照情報が順にnum変数へ代入され、そのnum変数をprint関数で表示しています。
このループではリスト要素の読み出しはできても「変更」をすることはできません。「num」変数の値を書き換えても、リストオブジェクトの要素の参照先は変化しないためです。
リスト要素を反復処理で「変更」したいとき
次はリスト要素を「変更」したい場合です。変更したい場合は、直接リスト要素への書き換えが必要となります。
num_list = [10, 20, 30]
# リスト要素の全てに「5」を加算
for i in range(len(num_list)):
num_list[i] += 5
print(num_list)
[15, 25, 35]
このようにリスト要素の内容を変更するには、インデックスによるリスト要素への代入が必要となります。
空リストの定義方法
リスト要素が後から追加・削除ができるということは、リスト定義時はリストの中身は空っぽでもよいということになりますね。
Pythonでは空のリスト変数を定義することも可能です。
空リスト変数の定義の書式
リスト変数名 = [] ・・・空のリストを代入する
リスト変数名 = list() ・・・list関数で空リストを作成して代入する
定義例
num_list = []
実際のプログラムでは、次のように空リストを作ります。
# 空リスト変数の定義
num_list = []
print(num_list)
[]
このように、空リストは表示しても[]が表示され、中身に何もないことが示されます。
空リストのままでは意味がありませんが、リスト要素は追加することができます。要素の追加方法は、次の記事にて紹介しましょう。
Q&A:Pythonの「リスト定義」に関するよくある質問
「リスト」で何か質問ある人はどうぞ!
Q:リストの要素数を越えてインデックスで参照したらどうなるの?
師匠!「インデックス番号」って要素数の範囲内じゃないとダメなんですよね!もし、もしもですよ、範囲外のインデックス番号でリスト要素を見たら、どうなっちゃうんですか?
「インデックス番号」の範囲外アクセスというのは、どの言語においてもあってはならないことなんだよね。何がおきるかは言語によって扱いが変わります。
Pythonで範囲外の「インデックス番号」で参照した場合はどうなるか実験していみよう!
それでは、次のようにリスト範囲外のインデックス番号を指定してみました。
# リストのインデックス範囲は[0~2]
num_list = [10, 20, 30]
print(num_list[3]) # 範囲外アクセス
実行結果は次のものとなります。
File "C:/PythonProject/project1/main.py", line 4, in <module>
print(num_list[3]) # 範囲外アクセス
IndexError: list index out of range
「list index out of range:範囲外のリストインデックスです」というエラーが発生しました。これは『例外』と呼ばれる異常が発生したことを示しています。
範囲外インデックスのアクセスは、プログラムが異常終了します。ですので、決して範囲外にならないように注意しましょう。
Q:リスト要素の値にいろいろなデータ型の値を指定したらどうなるの?
師匠!Pythonって言語は変数に好きな情報をなんでも書き込めるじゃないですか!ってことは、リストの要素にもいろんなデータ型の値を指定できるんですか?
Pythonは変数へのデータ設定が柔軟な言語だね。それはリストと言えど同じなんですよ。そのため、ひとつのリストの中に様々なデータ型の値を指定することも可能なんですよ。
Pythonの変数は様々なタイプの情報を好きに格納することができます。このルールはリスト要素にも適用されます。
次のようなプログラムも可能です。
# データ型が混在するリスト変数の定義
mix_list = [100, 3.14, "富士山"]
print(mix_list)
[100, 3.14, '富士山']
PyCharmのデバッガを利用すると、各リスト要素が別のデータ型で管理されているのが目に見えて理解できます。
このようにデータ型が混在する『リスト』を定義することは、あまりありません。しかし、Pythonプログラムとしては問題ないものとして管理されます。
課題:「リスト」の使い方が学べたかを確認しよう
課題1:リスト定義
課題内容
次の表のリストを持つリスト変数を定義せよ。
リスト変数名 | リストの意味 | 変数要素 |
prime_num | 20以下の素数 | 2 3 5 7 11 13 17 19 |
central_league | セントラルリーグのチーム名 | Giants Swallows BayStars Dragons Tigers Carp |
出力期待結果となるようにprint関数を使ってリスト内容を表示せよ。
出力期待結果
[2, 3, 5, 7, 11, 13, 17, 19]
['Giants', 'Swallows', 'BayStars', 'Dragons', 'Tigers', 'Carp']
リストの定義方法をおさらいしましょう。
# 素数の定義・表示
prime_num = [2, 3, 5, 7, 11, 13, 17, 19]
print(prime_num)
# セリーグチームの定義・表示
central_league = ["Giants", "Swallows", "BayStars", "Dragons", "Tigers", "Carp"]
print(central_league)
もっとも基本となるリストの定義方法を学びましょう。文字列も登録できますよ。
課題2:リスト要素の参照
課題内容
num_list変数のリスト要素の中から最大値を検索し画面に表示せよ。プログラムは次のものをベースに作成せよ。
# リスト変数の定義
num_list = [592, -39, 1065, 892, 198]
# max_numへリストの最大値を検索し格納せよ
# 最大値の出力
print("最大値:", max_num)
出力期待結果
最大値: 1065
# リスト変数の定義
num_list = [592, -39, 1065, 892, 198]
# max_numへリストの最大値を検索し格納せよ
max_num = num_list[0]
for num in num_list:
if max_num < num:
max_num = num
# 最大値の出力
print("最大値:", max_num)
『リスト』と反復は関係性が深い機能です。セットで扱うことが多いのでfor文やwhile文で扱えるようになっておきましょう。
課題3:リスト要素の変更
課題内容
num_list変数のリスト要素を昇順に並び替えて画面に表示せよ。プログラムは次のものをベースに作成せよ。
# リスト変数の定義
num_list = [592, -39, 1065, 892, 198]
# リストを昇順に並べ替えよ
# 並べ替え後のリスト表示
print(num_list)
出力期待結果
[-39, 198, 592, 892, 1065]
for文とインデックス番号を組み合わせた、リスト要素を変更するプログラムです。
# リスト変数の定義
num_list = [592, -39, 1065, 892, 198]
# リストを昇順に並べ替えよ
for i in range(len(num_list)):
for k in range(1 + i, len(num_list)):
if num_list[i] > num_list[k]:
tmp = num_list[i]
num_list[i] = num_list[k]
num_list[k] = tmp
# 並べ替え後のリスト表示
print(num_list)
バブルソートを使った昇順への並べ替えプログラムです。2つのループを組み合わせて小さい数を見つけて順番に並べています。
C言語技術者が知るべきPython言語との違い:「リスト」
すでにC言語を習得している人は、次のポイントに気を付けよう!
C言語の「配列」ではできない、高度な機能を「リスト」は持っています。
C言語においても「リスト」に相当するデータ構造を実現できますが、言語としての標準機能としてはサポートされていないため、独自で実装することもあります。
本記事で紹介した「定義方法」「参照」「変更」のみであれば、それほど『配列』と変わりないですね。次回の記事では『リスト』らしい機能を紹介しましょう。