こんにちは、ナナです。
前回の記事『Python リストオブジェクトの定義【リスト要素の読み書き方法】』では、リストオブジェクトの定義方法とリスト要素の読み書き方法について学びました。
本記事ではリスト要素の「追加」方法を学んでいきましょう。
リストは他の言語における『配列』に似ていますが、プログラムの実行途中でリスト要素を追加・削除できるという柔軟性を持つのが特徴です。
本記事では次の疑問点を解消する内容となっています。
では、リスト要素の「追加」方法について学んでいきましょう。
appendを使ったリスト要素の追加方法
師匠!Pythonの『リスト』には、C言語の『配列』ではできない要素の『追加』ができるらしいじゃないですかっ!
どんなプログラムを書けば追加できるんですか?
そうだね。『リスト』へ要素を追加することができます。いくつか追加する方法があるから順に解説しようね!
appendメソッドを使って終端に要素を追加しよう!
もっとも基本的な要素の追加方法は「appendメソッド」を使うことです。まずは、プログラムと実行結果を見ていただきましょう。
# リスト定義
num_list = [10, 20, 30]
print("追加前:", num_list)
# appendメソッドの呼び出し
num_list.append(40)
# 追加後のリスト表示
print("追加後:", num_list)
追加前: [10, 20, 30]
追加後: [10, 20, 30, 40]
「append」とは「追記する・付け加える」といった意味であり、リストの終端に要素を追加するための機能です。
リストの終端にデータを追加したければ、「append」を呼び出せばOKです。逆に言うと「append」は終端にしか追加できません。
appendメソッドの使い方
先ほどのプログラム例では、次のように「appendメソッド」という関数を呼び出しています。
num_list.append(40)
「appendメソッド」の引数には、要素が参照するオブジェクトを指定しています。
リストのappendメソッドの書式
リスト変数名.append(要素が参照するオブジェクト)
使用例
num_list.append(40)
リストオブジェクトには、「appendメソッド」以外にもたくさんのメソッドが用意されています。
メソッドの便利さを改めて紹介
『メソッド』の便利さとは、対象オブジェクトに対してメソッドという操作を実施できることでしたね。
例えば、次のように2つのリスト変数があった場合、「append」というメソッドは共通して利用できます。
num_list = [10, 20, 30]
num_list.append(40)
animal_list = ["象", "虎", "ネコ", "キリン"]
animal_list.append("ひつじ")
print("追加後:", num_list)
print("追加後:", animal_list)
追加後: [10, 20, 30, 40]
追加後: ['象', '虎', 'ネコ', 'キリン', 'ひつじ']
結果をみるとわかりますが「appendメソッド」の実施結果とは、指定したリスト変数に対して行われます。
つまり、
「操作対象」のオブジェクトに対して「メソッド」を実施する
この明確さがメソッドの便利さです。
「メソッド」の役割については『Python メソッドの役割【文字列型メソッドのコードで理解】』を復習してください。
insertメソッドにおける要素の追加方法
「append」というメソッドとやらを呼び出せば、リストの後ろにデータを追加できるのですね。
でも、先頭や真ん中にも入れたいときってあるかもしれませんよっ!師匠っ、どうするんですかっ!
そんなときは「insertメソッド」の出番だね。このメソッドを使えば、リスト要素を好きな場所に挿入することができるよ!
「insert」とは「挿入」という意味です。それでは「insertメソッド」の使い方を学びましょう!
insertメソッドを使って要素を間に挿入しよう!
insertメソッドを使えばリスト内の好きな場所に要素を「挿入」することができます。
リストのinsertメソッドの書式
リスト変数名.insert(挿入先インデックス番号, 要素が参照するオブジェクト)
使用例
num_list.insert(2, 40)
プログラムでは次のように利用します。
num_list = [10, 20, 30]
print("追加前:", num_list)
# insertメソッドで[2]の要素に「40」の値を挿入
num_list.insert(2, 40)
# 挿入後のリスト表示
print("追加後:", num_list)
追加前: [10, 20, 30]
追加後: [10, 20, 40, 30]
insertメソッドの第1引数に、要素を挿入したいインデックス番号を指定します。これにより任意の場所に要素を追加できます。
insertメソッドはappendメソッドの代わりも可能
appendメソッドはリスト終端への要素の追加ですが、insertメソッドを使っても終端へ追加することは可能です。
num_list = [10, 20, 30]
print("追加前:", num_list)
# insertメソッドで[3]に挿入
num_list.insert(3, 40)
# 挿入後のリスト表示
print("追加後:", num_list)
追加前: [10, 20, 30]
追加後: [10, 20, 30, 40]
本例では、要素終端のインデックス番号の[2]の次の番号である[3]を指定することで、終端に要素を追加することができます。
len関数を使用して次のようにも書くことができます。
num_list = [10, 20, 30]
print("追加前:", num_list)
# len(num_list)は「3」を示す
num_list.insert(len(num_list), 40)
# 挿入後のリスト表示
print("追加後:", num_list)
「insertメソッド」はリスト要素のどこにでも挿入ができることがわかりますね。先頭に挿入したければ「0」を指定しますよ、「1」じゃありませんから注意しましょう!
Q&A:Pythonの「append」と「insert」に関するよくある質問
リストの追加について質問ある人はどうぞ!
Q:「insertメソッド」で要素数よりも大きな数を指定したらどうなるの?
師匠!「insertメソッド」ってインデックス番号を指定するじゃないですか。存在しない大きなインデックス番号を指定したらどうなるんですか?
わたしね、予想できちゃいますよ。「例外」が発生するんでしょー、答え言っちゃいましたね!
リストで「インデックス番号」を範囲外にすると参照時は「例外」が発生したよね。じゃあ、「insertメソッド」の場合も実験して確認してみよう!
それでは、次のようにリスト範囲外のインデックス番号を指定してみました。思い切って[100]を指定しちゃいます。
num_list = [10, 20, 30]
print("追加前:", num_list)
# 存在しない[100]のインデックス番号を指定!
num_list.insert(100, 40)
# 挿入後のリスト表示
print("追加後:", num_list)
実行結果は次のようになります。
追加前: [10, 20, 30]
追加後: [10, 20, 30, 40]
なんと、例外も起きず終端に要素が追加されました。このように要素数以上のインデックス番号が指定された場合は終端に追加するという扱いになっています。
このようなメソッドの動作もしっかりと確認することで、使い勝手を確認しておくとよいでしょう。「もし~したらどうなるだろう?」というのは、プログラマーにとってすごく大事な視点ですよ。
Q:「insertメソッド」で要素数よりも大きな数を指定したらどうなるの?
師匠!リストには「append」と「insert」というメソッドを使うことができるのはわかりましたよ。
名探偵のわたしは気づいちゃったのです。メソッド2つあるってことはですよ・・・3つ目のメソッドもあるということですよ!ズバリ、そうなんでしょっ!
う、うん(名探偵じゃなくても気づきそうだけどね・・・)、あるよ。
リストだけでも使えるメソッドはたくさん用意されています。この後の記事でも紹介していきますよ。
ここから先の記事では、「メソッド」がたくさん登場していきます。
Pythonでプログラムを作るとは、メソッドを如何に組み合わせて目的を達成するかがポイントになってきます。それほどPythonには強力なメソッドが用意されているということなんです。
ここで問題は「リスト変数にはどんなメソッドがあるの?」ということなんです。
PyCharm統合開発環境には利用できるメソッドが一覧化する機能があります。これを使うとメソッドを把握することができますね。便利ですね。
変数名の後に「.」ドットを打ち込むことで自動的に表示されます。
一覧が消えてしまった場合は「Ctr」+「Space」で再度表示できます。
もう少し先の記事では、皆さん自身が「メソッド」を作り出すということも学んでもらいますよ。
課題:リストの追加方法の使い方が学べたかを確認しよう
課題1:リストへの要素追加
課題内容
次のリストの先頭に「50」、終端に「100」の要素を追加せよ
# リスト定義
num_list = [10, 20, 30]
print("追加前:", num_list)
# 先頭に「50」、終端に「100」の要素を追加せよ
# 挿入後のリスト表示
print("追加後:", num_list)
出力期待結果となることを確認せよ。
出力期待結果
追加前: [10, 20, 30]
追加後: [50, 10, 20, 30, 100]
insertメソッドとappendメソッドを使えば簡単ですね。
# リスト定義
num_list = [10, 20, 30]
print("追加前:", num_list)
# 先頭に「50」、終端に「100」の要素を追加せよ
num_list.insert(0, 50)
num_list.append(100)
# 挿入後のリスト表示
print("追加後:", num_list)
insertメソッドのみを使って、次のようにもプログラムできます。
# リスト定義
num_list = [10, 20, 30]
print("追加前:", num_list)
# 先頭に「50」、終端に「100」の要素を追加せよ
num_list.insert(0, 50)
num_list.insert(len(num_list), 100)
# 挿入後のリスト表示
print("追加後:", num_list)
プログラムの答えは1つじゃありません。いろいろな発想でプログラムしてもいいんですよ!
課題2:ループを使ったリストへの要素追加
課題内容
次の空リストに先頭から順に「10」「20」・・・「100」と、10~100までの数値を要素として追加せよ。
# 空リスト定義
num_list = []
print("追加前:", num_list)
# 先頭から「10」「20」・・・「100」の要素を追加せよ
# 挿入後のリスト表示
print("追加後:", num_list)
出力期待結果となることを確認せよ。
出力期待結果
追加前: []
追加後: [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
range関数を使えば簡単ですね。range関数は増加する数を指定することができます。
# リスト定義
num_list = []
print("追加前:", num_list)
# 先頭から「10」「20」・・・「100」の要素を追加せよ
for i in range(10, 100 + 1, 10):
num_list.append(i)
# 挿入後のリスト表示
print("追加後:", num_list)
次のように乗算を利用して追加する方法もあるでしょう。
# リスト定義
num_list = []
print("追加前:", num_list)
# 先頭から「10」「20」・・・「100」の要素を追加せよ
for i in range(1, 11):
num_list.append(i * 10)
# 挿入後のリスト表示
print("追加後:", num_list)
append関数を10個並べることもできますがやめておきましょう。規則性を見つけてプログラミングすることが、わたしたちプログラマーなのですから。
C言語技術者が知るべきPython言語との違い:リストの追加
すでにC言語を習得している人は、次のポイントに気を付けよう!
C言語の「配列」は、メモリ上に連続した領域で確保されなければならない制約があるため、「リスト」のような要素の挿入はそもそもできないのです。
Pythonの「リスト」は、メモリ上に連続に並んでいるわけではありません。そのため、このような柔軟性を持ったデータ構造が実現可能なのです。
C言語でもPythonの「リスト」に相当する機能を自分で作ること自体は可能なんですよ。言語として標準でサポートしていないということなんです。