こんにちは、ナナです。
前回の記事『Python appendとinsertメソッド【リスト要素の追加方法】』では、メソッドを使用したリスト要素の追加方法について学びました。
本記事ではリスト要素の削除方法を学んでいきましょう。
本記事では次の疑問点を解消する内容となっています。
では、リスト要素の「削除」方法について学んでいきましょう。
popメソッドを使ったリスト要素の削除方法
忍術の世界も「陰」と「陽」があるように、リストの世界にも「陰」と「陽」があるのです。つまり、リスト要素の「追加」を学んだ後は「削除」を学ぶってことですよね。
その通り!「追加」ができれば「削除」もできる、それでは『リスト』の削除方法について順に学んでいこうね!
popメソッドを使って終端の要素を削除してみよう!
リストには「popメソッド」というメソッドが用意されています。「pop」とは「取り出す」という意味であり、削除してその要素を取り出すことができます。
リスト終端の要素を削除するpopメソッドの書式
リスト変数名.pop()
使用例
num = num_list.pop()
実際のプログラムを示しましょう。
# リスト定義
num_list = [10, 20, 30, 40]
print("変更前:", num_list)
# popメソッドで終端要素を削除
num = num_list.pop()
# 削除後のリスト表示
print("変更後:", num_list)
print("取り出した要素:", num)
次のように終端の「40」の要素がリストから取り出されているのがわかりますね。
変更前: [10, 20, 30, 40]
変更後: [10, 20, 30]
取り出した要素: 40
戻り値を別の変数で受け取るか、捨てるかは自由に選択が可能です。
# 取り出した要素を別の変数へ保存
num = num_list.pop()
# 取り出した要素を受け取らずに捨てる
num_list.pop()
関数(メソッド)というものにおいて「戻り値」を使うか捨てるかは、関数を呼び出した側に権利があります。
必要なら使えばよいし、不要なら捨てればよいのです。
popメソッドで任意の要素の削除をしてみよう!
実はpopメソッドは終端だけでなく、任意の場所の要素を削除することができます。場所の指定は「インデックス番号」ですね。
リストの任意場所の要素を削除するpopメソッドの書式
リスト変数名.pop(インデックス番号)
使用例
num = num_list.pop(2)
「popメソッド」の引数に、インデックス番号を指定してみましょう。
# リスト定義
num_list = [10, 20, 30, 40]
print("変更前:", num_list)
# popメソッドで[2]の要素を削除
num = num_list.pop(2)
# 削除後のリスト表示
print("変更後:", num_list)
print("取り出した要素:", num)
変更前: [10, 20, 30, 40]
変更後: [10, 20, 40]
取り出した要素: 30
このように「popメソッド」の引数にインデックス番号を指定することで、その場所の要素を取り出すことができます。
引数のインデックス番号は指定した場合はその要素を、指定しない場合はデフォルトで終端の要素を削除する動作となっています。
「追加」ではinsertメソッド、「削除」ではpopメソッド、この2つがあれば任意の場所の要素を自由に追加・削除ができます。
removeメソッドによる「値」を指定した要素の削除
「popメソッド」があれば好きな要素を削除できるんですね。もうこれで十分ですね。今日の授業は終わりみたいなので帰りましょう。
わたくし忍としての手裏剣の修行もせねばならぬので、これにてゴメン!
ちょっと待ってー、まだ終わってないよ!
リストを削除する方法は「popメソッド」以外にもあるんだよ。もうちょっと頑張って勉強しようね。
リストには「removeメソッド」があり、このメソッドも要素を削除するための機能です。
removeメソッドを使って要素を削除してみよう!
「remove」とは「削除する」という意味であり、要素を削除することができます。
リストのを削除するremoveメソッドの書式
リスト変数名.remove(削除したい要素が参照しているオブジェクト)
使用例
num_list.remove(30)
removeメソッドの引数は、インデックス番号ではなく「オブジェクト」です。
# リスト定義
num_list = [10, 20, 30, 40]
print("変更前:", num_list)
# リストから同一の値を持つ要素[2]を削除
num_list.remove(30)
# 削除後のリスト表示
print("変更後:", num_list)
変更前: [10, 20, 30, 40]
変更後: [10, 20, 40]
このように「30」という値を持つ要素を先頭から検索し、見つかったら削除します。
インデックス番号ではなく、「オブジェクト」を指定して削除するのがremoveメソッドの特徴です。
removeメソッドは先頭から検索して最初に見つけた要素を削除する
「removeメソッド」では、先頭から順に要素を探し、最初に見つけた同一のオブジェクトを持つ要素を削除します。
そのため次のように要素の中に対象のオブジェクトが2つ存在する場合は、先頭に近い要素が削除されます。
# リスト定義[2][4]に同一の「30」を設定
num_list = [10, 20, 30, 40, 30]
print("変更前:", num_list)
# リスト先頭から最初に見つけた値を持つ要素[2]を削除
num_list.remove(30)
# 削除後のリスト表示
print("変更後:", num_list)
変更前: [10, 20, 30, 40, 30]
変更後: [10, 20, 40, 30]
同じオブジェクトを参照する要素が全て削除されるわけではありません。先頭から順に検索して、最初に見つかった要素しか削除できません。
clearメソッドによる要素の全削除
「popメソッド」に「removeメソッド」と削除する方法もいろいろあるものですね。
師匠!本記事のタイトルに「clear(クリア)」っていうのが、まだありますよ。これも削除に関係するんですか?
「clear(クリア)」はその名の通り、要素をクリアしちゃうんだよ。つまり、要素を全て消しちゃうってことだね!
clearメソッドを使って要素を全て削除してみよう!
clearメソッドはリスト内の全ての要素を一度に削除するメソッドです。扱うときには注意して使いましょう。
リスト要素を全て削除するメソッドの書式
リスト変数名.clear()
使用例
num = num_list.clear()
プログラムでは次のように利用します。
# リスト定義
num_list = [10, 20, 30, 40]
print("変更前:", num_list)
# リストの全クリア
num_list.clear()
# 削除後のリスト表示
print("変更後:", num_list)
変更前: [10, 20, 30, 40]
変更後: []
リストの変数はまだ使えますので、「appendメソッド」や「insertメソッド」を使うことでリスト要素を再度追加することは可能です。
「clear」しても要素がなくなっただけで、リスト変数自体は生きていますよ。
Q&A:Pythonのリストの削除に関するよくある質問
リストの削除について質問ある人はどうぞ!
Q:「removeメソッド」で要素内に存在しない値を指定したらどうなるの?
「removeメソッド」って値を指定するじゃないですか。ってことはですよ、要素の中に存在しない値を指定しちゃったってこともありえますよね。その場合は要素は何も消されないってことでいいんですか?
ふむふむ、確かにそのパターンはありそうだね。値っていっても無限の範囲があるからね。
じゃあ、実験してみましょう。
それでは次のようにリスト内に存在しない「50」の値の要素をremoveメソッドで削除してみましょう。
# リスト定義
num_list = [10, 20, 30, 40]
print("変更前:", num_list)
# リスト要素に存在しない値を削除指定しちゃった・・・
num_list.remove(50)
# 削除後のリスト表示
print("変更後:", num_list)
結果は次のように「例外」が発生してしまいました。
File "C:/PythonProject/project1/main.py", line 6, in <module>
num_list.remove(50)
ValueError: list.remove(x): x not in list
つまり、要素内に存在しない値は指定しないことです。実際に使う場合は、この例外が発生してしまうことがあるため、例外への対策を実施する必要あります。
課題:リストの削除方法の使い方が学べたかを確認しよう
課題1:リストからの要素削除
課題内容
次のリストの「20」と「50」の要素を「popメソッド」を利用して削除せよ。
# リスト定義
num_list = [10, 20, 30, 40, 50]
print("変更前:", num_list)
# 「20」と「50」の要素を削除せよ
# 削除後のリスト表示
print("変更後:", num_list)
出力期待結果となることを確認せよ。
出力期待結果
変更前: [10, 20, 30, 40, 50]
変更後: [10, 30, 40]
popメソッドの基本的な使用方法ですね。インデックス番号の扱いに注意が必要です。
# リスト定義
num_list = [10, 20, 30, 40, 50]
print("変更前:", num_list)
# 「20」と「50」の要素を削除せよ
num_list.pop(1)
num_list.pop()
# 削除後のリスト表示
print("変更後:", num_list)
インデックス番号は「0」から始まることに注意しましょう。「20」を削除したければ「1」がインデックス番号ですよ!
課題2:リストからの要素削除と追加
課題内容
次のリストの「Java」をremoveメソッドで削除し、同じ場所に「C++」を追加せよ。
# リスト定義
lang_list = [
"Python",
"C言語",
"Java",
"HTML",
"JavaScript",
]
print("変更前:", lang_list)
# 「Java」を削除し、削除した場所に「C++」を追加せよ
# 削除後のリスト表示
print("変更後:", lang_list)
出力期待結果となることを確認せよ。
出力期待結果
変更前: ['Python', 'C言語', 'Java', 'HTML', 'JavaScript']
変更後: ['Python', 'C言語', 'C++', 'HTML', 'JavaScript']
removeメソッドは値によって削除するメソッドですね。
# リスト定義
lang_list = [
"Python",
"C言語",
"Java",
"HTML",
"JavaScript",
]
print("変更前:", lang_list)
# 「Java」を削除し、削除した場所に「C++」を追加せよ
lang_list.remove("Java")
lang_list.insert(2, "C++")
# 削除後のリスト表示
print("変更後:", lang_list)
「削除」だけでなく「追加」も思い出してくださいね。
C言語技術者が知るべきPython言語との違い:リストの削除
すでにC言語を習得している人は、次のポイントに気を付けよう!
C言語の「配列」は、メモリ上に連続した領域で確保されなければならない制約があるため、「リスト」のような要素の削除はできません。