リスト.pop() / リスト.remove() / リスト.clear()
| 対応: | pop() / remove() | Python 2(2000) |
|---|---|---|
| clear() | Python 3.3(2012) |
リストから要素を削除するメソッドと構文です。インデックス指定・値指定・全削除など目的に応じた方法があります。
構文
# 指定したインデックスの要素を削除して返す(デフォルトは末尾) リスト.pop(インデックス=-1) # 値が一致する最初の要素を削除する(戻り値は None) リスト.remove(値) # リストの全要素を削除する(戻り値は None) リスト.clear() # インデックスや範囲を指定して要素を削除する del リスト[インデックス] del リスト[開始:終了]
関数一覧
| メソッド・構文 | 概要 |
|---|---|
| list.pop(i=-1) | インデックス i の要素を削除し、その値を返します。引数を省略すると末尾の要素を削除します。 |
| list.remove(x) | リスト中で最初に一致する値 x の要素を削除します。値が存在しない場合は ValueError が発生します。 |
| list.clear() | リストのすべての要素を削除して空リストにします。del list[:] と同じ効果です。 |
| del list[i] | インデックス i または スライス範囲の要素を削除します。削除した値は返されません。 |
サンプルコード
list_pop_remove_1.py
# pop() で末尾の要素を取り出す(スタックの pop 操作) pilots = ["碇シンジ", "綾波レイ", "惣流アスカ", "渚カヲル", "葛城ミサト"] last = pilots.pop() print(last) # 葛城ミサト print(pilots) # ['碇シンジ', '綾波レイ', '惣流アスカ', '渚カヲル'] # pop() にインデックスを指定して任意の要素を取り出す first = pilots.pop(0) print(first) # 碇シンジ print(pilots) # ['綾波レイ', '惣流アスカ', '渚カヲル']
python3 list_pop_remove_1.py 葛城ミサト ['碇シンジ', '綾波レイ', '惣流アスカ', '渚カヲル'] 碇シンジ ['綾波レイ', '惣流アスカ', '渚カヲル']
list_pop_remove_2.py
# remove() で値を指定して削除する
pilots = ["碇シンジ", "綾波レイ", "惣流アスカ", "綾波レイ"]
pilots.remove("綾波レイ") # 最初に見つかった "綾波レイ" を削除する
print(pilots) # ['碇シンジ', '惣流アスカ', '綾波レイ']
# 存在しない値を remove() で削除しようとすると例外が発生する
try:
pilots.remove("渚カヲル")
except ValueError:
print("渚カヲル はリストにありません。")
python3 list_pop_remove_2.py ['碇シンジ', '惣流アスカ', '綾波レイ'] 渚カヲル はリストにありません。
list_pop_remove_3.py
# del でインデックス指定して削除する pilots = ["碇シンジ", "綾波レイ", "惣流アスカ", "渚カヲル", "葛城ミサト"] del pilots[2] print(pilots) # ['碇シンジ', '綾波レイ', '渚カヲル', '葛城ミサト'] # del でスライスを使って範囲削除する del pilots[1:3] print(pilots) # ['碇シンジ', '葛城ミサト'] # clear() で全要素を削除する pilots.clear() print(pilots) # [] print(len(pilots)) # 0
python3 list_pop_remove_3.py ['碇シンジ', '綾波レイ', '渚カヲル', '葛城ミサト'] ['碇シンジ', '葛城ミサト'] [] 0
よくあるミス
よくあるミス1: 存在確認なしに remove() を呼ぶ
値がリストにない場合、remove() は ValueError を送出します。in 演算子で事前確認するか、try-except で例外を捕捉する方法があります。
mistake1_ng.py
pilots = ["碇シンジ", "綾波レイ", "惣流アスカ"]
pilots.remove("渚カヲル") # ValueError
mistake1_ok.py
pilots = ["碇シンジ", "綾波レイ", "惣流アスカ"]
if "渚カヲル" in pilots:
pilots.remove("渚カヲル")
else:
print("渚カヲル はリストにありません。")
よくあるミス2: for ループ中にリストを変更する
for ループ中に remove() や pop() を使うとインデックスがずれて予期しない動作になります。リスト内包表記で新しいリストを作成する方法が安全です。
mistake2_ng.py
scores = [55, 80, 45, 92, 60]
for s in scores:
if s < 60:
scores.remove(s) # インデックスがずれて要素をスキップする
print(scores) # [80, 45, 92, 60](45 が残る)
mistake2_ok.py
scores = [55, 80, 45, 92, 60] scores = [s for s in scores if s >= 60] # 新しいリストを作成 print(scores) # [80, 92, 60]
概要
pop() は削除した値を返すため、削除と同時に値を使いたい場合に便利です。一方、remove() は値を返さずに削除するだけです。remove() は値が存在しない場合に ValueError が発生するため、安全のために事前に in 演算子で存在確認を行うか、try-exceptで例外を処理する方法があります。
『del』は Python のキーワードで、リストの要素だけでなく変数そのものを削除することもできます。『del my_list』とするとリスト変数そのものが削除されます(『clear()』とは異なります)。
ループ中にリストから要素を削除する場合は注意が必要です。『for』ループ中に『remove()』や『pop()』を使うとインデックスがずれて予期しない動作になります。ループ中の削除には、元のリストのコピー(『list[:]』)を反復するか、『リスト内包表記』で新しいリストを作成する方法が安全です。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。