「リストの最後の要素を削除したい」
「削除した要素を別の変数に保存して使いたい」
このような場面でとても便利なのが、Pythonのpop()
メソッドです。
pop()
を使うと、リストから要素を取り出して削除することが、たった1行でできます。
この記事では、pop()
の基本的な使い方から、インデックス指定、エラー対策、応用テクニックまで、初心者の方にもわかりやすく解説します。
popメソッドの基本的な使い方

最後の要素を取り出して削除
pop()
メソッドは、リストの最後の要素を取り出して、同時にリストからその要素を削除します。
fruits = ["りんご", "バナナ", "オレンジ"]
last_fruit = fruits.pop()
print(f"取り出した果物: {last_fruit}")
print(f"残った果物: {fruits}")
実行結果:
取り出した果物: オレンジ
残った果物: ['りんご', 'バナナ']
このように、pop()
は「削除」と「取得」を同時に行う便利なメソッドです。
popの特徴
pop()
メソッドには以下の特徴があります:
- 戻り値あり:取り出した要素を返してくれる
- 破壊的操作:元のリストが変更される
- 引数なし:最後の要素を対象とする
numbers = [10, 20, 30, 40]
print(f"削除前: {numbers}")
removed = numbers.pop()
print(f"削除した数: {removed}")
print(f"削除後: {numbers}")
実行結果:
削除前: [10, 20, 30, 40]
削除した数: 40
削除後: [10, 20, 30]
インデックスを指定して特定の位置を削除
位置を指定して削除
pop()
には、削除したい要素の位置(インデックス)を指定することもできます。
colors = ["赤", "青", "緑", "黄色"]
# 最初の要素(インデックス0)を削除
first_color = colors.pop(0)
print(f"削除した色: {first_color}")
print(f"残った色: {colors}")
実行結果:
削除した色: 赤
残った色: ['青', '緑', '黄色']
いろいろな位置の指定方法
animals = ["犬", "猫", "鳥", "魚", "うさぎ"]
# 2番目の要素を削除(インデックス1)
second = animals.pop(1)
print(f"2番目の動物: {second}")
print(f"残った動物: {animals}")
# 最後から2番目を削除(負のインデックス)
second_last = animals.pop(-2)
print(f"最後から2番目: {second_last}")
print(f"最終的な動物: {animals}")
実行結果:
2番目の動物: 猫
残った動物: ['犬', '鳥', '魚', 'うさぎ']
最後から2番目: 魚
最終的な動物: ['犬', '鳥', 'うさぎ']
インデックスの指定方法まとめ
指定方法 | 意味 | 例 |
---|---|---|
pop() | 最後の要素 | list.pop() |
pop(0) | 最初の要素 | list.pop(0) |
pop(1) | 2番目の要素 | list.pop(1) |
pop(-1) | 最後の要素 | list.pop(-1) |
pop(-2) | 最後から2番目 | list.pop(-2) |
注意点:空のリストでエラーが発生

エラーが起こる例
空のリストに対してpop()
を使うと、エラーが発生します。
empty_list = []
# empty_list.pop() # IndexError: pop from empty list
このコードを実行すると、以下のエラーが表示されます:
IndexError: pop from empty list
エラーを防ぐ方法
リストが空でないかを事前にチェックしましょう。
shopping_list = []
# 安全な方法
if shopping_list:
item = shopping_list.pop()
print(f"取り出したもの: {item}")
else:
print("買い物リストは空です")
実行結果:
買い物リストは空です
try-except文を使った方法
エラーハンドリングを使った方法もあります。
todo_list = []
try:
task = todo_list.pop()
print(f"次のタスク: {task}")
except IndexError:
print("タスクがありません")
実行結果:
タスクがありません
実用的な使用例

スタック構造として使う
pop()
は、「後に入れたものを先に取り出す」スタック構造を実現するのに最適です。
# 本を積み重ねるイメージ
book_stack = []
# 本を積む(append)
book_stack.append("Python入門")
book_stack.append("データ分析の基礎")
book_stack.append("機械学習入門")
print(f"積まれた本: {book_stack}")
# 本を取る(pop)
while book_stack:
current_book = book_stack.pop()
print(f"読んでいる本: {current_book}")
実行結果:
積まれた本: ['Python入門', 'データ分析の基礎', '機械学習入門']
読んでいる本: 機械学習入門
読んでいる本: データ分析の基礎
読んでいる本: Python入門
リストを逆順にする
original = [1, 2, 3, 4, 5]
reversed_list = []
# 元のリストから最後の要素を取り出して新しいリストに追加
while original:
reversed_list.append(original.pop())
print(f"逆順になったリスト: {reversed_list}")
実行結果:
逆順になったリスト: [5, 4, 3, 2, 1]
タスク処理システム
tasks = ["メール確認", "資料作成", "会議準備", "レポート提出"]
print("今日のタスク処理を開始します")
task_count = 1
while tasks:
current_task = tasks.pop(0) # 最初のタスクから処理
print(f"{task_count}. {current_task} - 完了")
task_count += 1
print("すべてのタスクが完了しました!")
実行結果:
今日のタスク処理を開始します
1. メール確認 - 完了
2. 資料作成 - 完了
3. 会議準備 - 完了
4. レポート提出 - 完了
すべてのタスクが完了しました!
最大値・最小値を順番に取り出す
scores = [85, 92, 78, 96, 88]
sorted_scores = sorted(scores, reverse=True) # 降順でソート
print("成績の高い順に発表します:")
rank = 1
while sorted_scores:
score = sorted_scores.pop(0)
print(f"{rank}位: {score}点")
rank += 1
実行結果:
成績の高い順に発表します:
1位: 96点
2位: 92点
3位: 88点
4位: 85点
5位: 78点
他の削除メソッドとの比較

pop、remove、delの違い
Pythonでリストの要素を削除する方法は複数あります。それぞれの特徴を比較してみましょう。
メソッド | 削除方法 | 戻り値 | 用途 |
---|---|---|---|
pop() | インデックスで指定 | あり(削除した要素) | 削除した要素を使いたいとき |
remove() | 値を指定 | なし | 特定の値を削除したいとき |
del | インデックスやスライス | なし | 単純に削除だけしたいとき |
実際の比較例
# 各メソッドの動作比較
numbers = [10, 20, 30, 40, 50]
# pop(): インデックスで削除+戻り値あり
numbers1 = numbers.copy()
removed_pop = numbers1.pop(2)
print(f"pop(2): 削除した値={removed_pop}, 残り={numbers1}")
# remove(): 値で削除+戻り値なし
numbers2 = numbers.copy()
numbers2.remove(30)
print(f"remove(30): 削除後={numbers2}")
# del: インデックスで削除+戻り値なし
numbers3 = numbers.copy()
del numbers3[2]
print(f"del [2]: 削除後={numbers3}")
実行結果:
pop(2): 削除した値=30, 残り=[10, 20, 40, 50]
remove(30): 削除後=[10, 20, 40, 50]
del [2]: 削除後=[10, 20, 40, 50]
使い分けの指針
- 削除した要素を使いたい →
pop()
- 特定の値を削除したい →
remove()
- 単純に削除だけしたい →
del
パフォーマンスの考慮

末尾削除 vs 先頭削除
リストの削除位置によって、処理速度が変わります。
import time
# 大きなリストを作成
big_list = list(range(100000))
# 末尾削除の時間測定
start_time = time.time()
big_list.pop() # 末尾削除
end_time = time.time()
print(f"末尾削除の時間: {end_time - start_time:.6f}秒")
# 先頭削除の時間測定
start_time = time.time()
big_list.pop(0) # 先頭削除
end_time = time.time()
print(f"先頭削除の時間: {end_time - start_time:.6f}秒")
一般的な結果:
- 末尾削除:とても高速
- 先頭削除:リストが大きいと遅い(要素をずらす必要があるため)
先頭削除を頻繁に行う場合の代替案
先頭削除を頻繁に行う場合は、collections.deque
を使うと効率的です。
from collections import deque
# dequeを使った場合
queue = deque([1, 2, 3, 4, 5])
first = queue.popleft() # 先頭削除が高速
print(f"削除した要素: {first}")
print(f"残った要素: {list(queue)}")
実行結果:
削除した要素: 1
残った要素: [2, 3, 4, 5]
よくある質問と解決方法

Q: popで削除した要素を元に戻せる?
A: pop()
は破壊的操作なので、直接は戻せません。事前にバックアップを作成するか、削除した要素を適切な位置にinsert()
で戻す必要があります。
numbers = [1, 2, 3, 4, 5]
backup = numbers.copy() # バックアップ作成
removed = numbers.pop(2)
print(f"削除後: {numbers}")
# 元に戻す
numbers.insert(2, removed)
print(f"復元後: {numbers}")
Q: 複数の要素を一度にpopできる?
A: pop()
は1つの要素しか削除できません。複数削除したい場合は、ループや他の方法を使います。
# 最後の3つの要素を削除
data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
removed_items = []
for _ in range(3):
if data:
removed_items.append(data.pop())
print(f"削除した要素: {removed_items}")
print(f"残った要素: {data}")
実行結果:
削除した要素: [10, 9, 8]
残った要素: [1, 2, 3, 4, 5, 6, 7]
Q: popとappendを組み合わせて使うには?
A: 非常によく使われるパターンです。キューやスタック構造を実現できます。
# 簡単なジョブキュー
job_queue = ["job1", "job2", "job3"]
completed_jobs = []
while job_queue:
current_job = job_queue.pop(0) # 先頭から取得
print(f"処理中: {current_job}")
completed_jobs.append(current_job) # 完了リストに追加
print(f"完了したジョブ: {completed_jobs}")
まとめ
pop()
メソッドは、Pythonでリスト操作を行う上で非常に重要な機能です。
重要なポイント
pop()
は要素の削除と取得を同時に行う- 引数なしで末尾、インデックス指定で特定位置を削除
- 戻り値として削除した要素を受け取れる
- 空のリストでは
IndexError
が発生する - 破壊的操作なので元のリストが変更される
使用場面
場面 | 使い方 | 例 |
---|---|---|
スタック操作 | pop() | 後入れ先出し |
キュー操作 | pop(0) | 先入れ先出し |
逆順処理 | pop() でループ | リストを逆順に |
条件処理 | 要素を取り出して判定 | タスク処理システム |
コメント