【Python】pop()とは?リストや辞書から要素を取り除く使い方を初心者向けに解説

はじめに

Pythonには、さまざまなデータ構造が用意されています。
その中でも、リスト(配列のようなもの)や辞書といったデータ構造は、日常的なプログラム開発でよく使われるものです。
これらのデータ構造を扱ううえで、pop() というメソッドを活用すると要素を取り除く処理が簡単に実装できます。
たとえば、リストから特定の要素を取り出しつつ削除したり、辞書から特定のキーと値をまとめて取り除いたりといった処理です。

今回は、初心者の方に向けてpop() の基本的な使い方から実務的な活用例、そしてエラー対策や関連するメソッドとの違いなどを丁寧に解説します。

この記事を読むとわかること

  • pop()メソッドの基本的な仕組み
  • リストや辞書への適用方法と注意点
  • 実務で考えられる活用シーンやエラーハンドリング
  • remove()など類似メソッドとの違い

ここではプログラミング未経験や初心者の方でも理解しやすいよう、具体的なコード例を交えながら進めます。
日々の開発や学習で「Python pop」という情報を必要としている方に、少しでも参考になる内容となれば嬉しいです。

pop()とは

pop()は、Pythonにおいてリストや辞書などのデータ構造から要素を削除するためのメソッドです。
単純に要素を削除するだけでなく、削除した要素の値(リストの場合)や削除したキーに対応する値(辞書の場合)を返してくれるため、取得と削除が同時に行える点が特徴です。

pop()はリストに対しては list.pop(index) のように、辞書に対しては dict.pop(key[, default]) のように使われます。
リストと辞書では呼び出し方と引数の意味が異なりますが、どちらも削除するという基本的な役割は共通しています。

pop()の基本的なしくみ

pop()を呼び出すと、指定した要素がデータ構造から取り除かれます。
同時に、その要素の値が返されます。
たとえば、リストの場合はインデックスを指定すると、そのインデックス位置の要素が取り除かれ、同じ値を戻り値として受け取れます。
辞書の場合は削除対象のキーを指定すると、そのキーと対応する値が取り除かれ、値が戻り値として返されます。

pop()の戻り値

先ほど少し触れたとおり、pop()を使うと削除した要素の値を戻り値として得られます。
リストの場合、要素そのものが戻り値です。
辞書の場合はキーに対応する値が戻り値として返ってきます。
削除したいだけでなく、同時にその削除対象の情報も使いたいときに便利です。

pop()のメリット

1. 取り出すと同時に削除

従来であれば、ある要素を取得した後に別途削除する、という手間がありました。
pop()なら取得と削除が一度にできるので、コード量が減り、処理がわかりやすくなります。

2. リストや辞書の末尾・最後にアクセスしやすい

リストの場合、引数を省略することで末尾の要素を削除できます。
このように効率よく最後の要素を取り出せるのは便利です。

3. データ構造の操作が直感的

「取り除く」と表現される通り、実際に「ポップアウトする」イメージで使えます。
そのため、学習段階でも理解しやすく、使い始めると使い勝手の良さを実感できます。

リストでのpop()の使い方

リストに対してpop() を使うと、指定したインデックス位置の要素を取り除くことができます。
もしインデックスを指定しなければ、末尾の要素を取り除いた上でそれを返してくれます。

リストの基本コード例

ここでは、簡単なコード例を見てみましょう。

fruits = ["apple", "banana", "cherry", "date"]
removed_fruit = fruits.pop()  # インデックスを指定しない場合は末尾を削除
print(removed_fruit)  # "date" が出力される
print(fruits)         # ["apple", "banana", "cherry"] と表示される

この例では、末尾の "date" が取り除かれて、戻り値として取得できます。
また、リストの中身は "date" を除く3つの要素に変わります。

もし特定の要素を削除したいなら、その要素のインデックスを指定します。

numbers = [10, 20, 30, 40, 50]
removed_num = numbers.pop(2)
print(removed_num)  # 30 が出力される
print(numbers)      # [10, 20, 40, 50] が表示される

これによってインデックス2(リストが0始まりなので3番目)にあった数値30が削除され、戻り値としても30が得られます。

リストにおけるpop()の注意点

1. 無効なインデックスを指定するとエラーが発生する

たとえばリストの範囲を超えたインデックスを指定した場合、IndexErrorが発生します。
削除処理の前に、インデックスがリストの長さを超えていないかチェックする必要があるかもしれません。

2. 要素が空のリストではインデックスなしのpop()はエラー

リストが空の場合、引数無しのpop()を呼び出すとIndexErrorとなります。
実務では、リストに要素があるかどうか事前に確認する手段を用意することが多いです。

3. return値を活用するかどうか

pop()は削除した要素を返してくれますが、それを使わないなら代入しなくても構いません。
ただし、ログを残すなどの用途がある場合は、取得した要素を活用すると便利です。

リストを使った実務でのデータ管理例

例えば、リストをキューやスタックのように使いたい場合にpop()が役立ちます。
スタック構造(後入れ先出し)として運用する際は、末尾に追加(append)して末尾からpop()という操作がよく使われます。
下記はスタック構造の簡単なイメージ例です。

stack = []
stack.append("TaskA")
stack.append("TaskB")
stack.append("TaskC")

task = stack.pop()  # "TaskC" を取り出し、stackは ["TaskA", "TaskB"] になる
print(task)         # "TaskC"

こうした方法で、タスクの追加と処理が直感的に行えます。
リストのappend()とpop()がセットで使われることが多いのは、こうしたシンプルでわかりやすいスタックやキューの実装がすぐにできるからです。

辞書でのpop()の使い方

次に、辞書型でのpop() を見ていきましょう。
辞書の場合は、削除したいキーを指定し、そのキーに対応する値を戻り値として受け取ることができます。

辞書の基本コード例

以下の例で見てみます。

employee = {
    "name": "Alice",
    "age": 30,
    "department": "Sales"
}

removed_value = employee.pop("age")
print(removed_value)  # 30
print(employee)       # {"name": "Alice", "department": "Sales"}

キー"age"を指定してpop()を呼び出すと、辞書から "age": 30 の項目が削除されます。
同時に戻り値として30を取得できます。

default引数について

辞書のpop()では、第2引数としてdefaultを指定できます。
これは、指定したキーが存在しないときに返される値を設定する機能です。
もしdefaultを指定しないで存在しないキーをpop()しようとするとKeyErrorという例外が発生します。

inventory = {
    "apple": 5,
    "banana": 3
}

removed_item = inventory.pop("cherry", 0)  # cherryが無い場合は0を返す
print(removed_item)  # 0
print(inventory)     # {"apple": 5, "banana": 3}

キー"cherry"は存在しないため、KeyErrorではなく0が返される仕組みです。

辞書でのpop()の実務的な活用シーン

実務でも、辞書の管理やデータの更新は頻繁に行われます。
たとえば、APIから取得したデータを一時的に辞書で管理しておき、不要になったキーを取り除くことがあるでしょう。

また、在庫管理システムのように商品をキーにして在庫数を値に設定しているケースでは、商品がもう取り扱い終了になったら辞書からそのキーを削除するかもしれません。
こういった場面でpop()を使うことで、削除する値をログに書き残すなどの処理を自然に書けるメリットがあります。

pop()と似たメソッドとの比較

Pythonには、要素を削除する手段としてpop()以外にもいくつかのメソッドがあります。
同じように「取り除く」という目的を果たすものとしてはremove()popitem() などがあります。
このセクションでは、それらとの違いを少し掘り下げてみましょう。

remove()との違い

リストの場合、要素を削除するメソッドとしてremove()があります。
pop()と何が違うかというと、remove()は「値を指定して削除」する方法です。
つまり、以下のような振る舞いになります。

numbers = [10, 20, 30, 20, 40]
numbers.remove(20)
print(numbers)  # [10, 30, 20, 40]

この例では、最初に見つかった20が削除されます。
もしlist.pop()を使う場合には「削除したい要素のインデックス」を指定しなければならないため、対象がどのインデックスにあるかがわかっていないと手間がかかるケースもあります。
一方、remove()は「この値を削除したい」というケースで使いやすいです。

ただし、remove()を使う場合は「リストのどこかに存在する値」を削除するので、存在しない値を削除しようとするとValueErrorが発生します。
pop()とは使い方やエラーの起こり方が違う点を理解しておくとよいでしょう。

popitem()との違い

辞書にはpopitem() というメソッドが用意されています。
popitem()は、辞書の最後に追加された要素を取り除いて返すメソッドです。
Python 3.7以降、辞書は挿入順序を保持するようになり、popitem()は最後に挿入されたキーと値を削除して(キー, 値)のタプルを返します。

data = {
    "task1": "Done",
    "task2": "Pending",
    "task3": "In Progress"
}

item = data.popitem()
print(item)  # ("task3", "In Progress") といったタプルが返る想定
print(data)  # {"task1": "Done", "task2": "Pending"}

このように、キーを明示指定するのではなく、「最後に追加された要素」を削除する点が辞書のpop()とは異なる部分です。
辞書のpop()は、削除したいキーを明示的に指定する必要があります。
どちらを使うかは要件次第ですが、一般的には「どのキーを削除したいか」が明確なときにpop()、スタック的に最後に追加された要素を取り除きたいならpopitem()を利用するイメージです。

実務で気をつけたいエラーハンドリングとパターン

pop()を使ううえで発生しうるエラーや注意点を整理しておくと、より実務に落とし込みやすくなります。
以下では、典型的なエラーパターンや対策のヒントを簡単にまとめます。

リストが空のときのIndexError

先ほども触れましたが、リストが空の状態で pop() をインデックス指定なしに呼び出すとIndexErrorが発生します。
バッチ処理やサーバーサイドのロジックなどで、多数のリストを処理する際には以下のように要素数を確認してからpop()することが多いです。

tasks = []

if tasks:  # リストに要素があるかどうかを確認
    last_task = tasks.pop()
    print("取り出したタスク:", last_task)
else:
    print("タスクがありません。")

リストの範囲外インデックス指定時のIndexError

pop(100) のように存在しないインデックスを指定すると、IndexErrorが発生します。
意図しないインデックスを指定しないように、呼び出し側でインデックス値が範囲内かをチェックしたり、必要に応じて例外処理を行うことがあります。

辞書でキーが存在しない場合のKeyError

辞書に対して dict.pop(key) を呼び出すとき、キーが存在しない場合はKeyErrorとなります。
これを回避したいなら、たとえば pop(key, default) としてdefault値を設定するか、キーが存在するかどうかをあらかじめ if key in dict: で確認する方法が考えられます。

config = {
    "mode": "production"
}

value = config.pop("timeout", None)
if value is None:
    print("timeoutは設定されていません。")
else:
    print("timeout =", value)

取り除く要素が確定していない場合の対処

複数の要素から条件に合致するものだけ削除したい場合、pop()を直接呼び出すよりも別の方法を使ったほうがわかりやすいことがあります。
例えば、辞書内で特定の値を持つキーをまとめて除去したい場合は、一度削除対象のキー一覧をリストアップし、それをループでpop()する方法などが考えられます。
このとき、途中で辞書を直接イテレーションしながら削除するとエラーを引き起こす可能性があるので、削除対象をあらかじめまとめておくと安全です。

具体的な実装パターン:タスク管理ツールの例

ここでは、タスクを管理する簡単なツールをイメージし、pop()を活用するコードの一例を示します。
想定としては、タスクをリストで保持し、途中で特定のタスクを取り除きたいシーンです。

def remove_task(task_list, task_name):
    """
    task_listの中から指定したtask_nameを見つけて削除し、
    削除したタスク名を返す。
    """
    if task_name in task_list:
        # indexを探してからpop()で削除するパターン
        index = task_list.index(task_name)
        return task_list.pop(index)
    return None

tasks = ["Design", "Coding", "Review", "Testing"]

result = remove_task(tasks, "Coding")
print(result)  # "Coding"
print(tasks)   # ["Design", "Review", "Testing"]

このように、まず task_name in task_list で削除対象が存在するかどうかを確認し、 index() を使ってインデックスを取得し、pop()で削除する形です。
リスト内に重複する同じ名前のタスクがあった場合は、最初に見つかったものだけが削除対象になります。

もう少し複雑な例として、複数のタスクを辞書で管理し、キーをタスク名、値をステータス(たとえば "Incomplete", "Complete" など)として持っていることもあるでしょう。
その場合、特定のキーを削除するときに辞書のpop()を使います。

def remove_task_by_dict(task_dict, task_name):
    """
    task_dictの中からkeyとしてtask_nameを削除し、
    削除したタスクのステータスを返す。
    """
    status = task_dict.pop(task_name, None)
    return status

task_status = {
    "Design": "Incomplete",
    "Coding": "Incomplete",
    "Review": "Complete"
}

removed_status = remove_task_by_dict(task_status, "Coding")
print(removed_status)  # "Incomplete"
print(task_status)      # {"Design": "Incomplete", "Review": "Complete"}

上記のようにpop()の第2引数としてNoneを指定しておけば、キーが存在しなかった場合にKeyErrorが起きるのを防げます。

パフォーマンス面の注意

実務では、データサイズが大きい場合や、頻繁にリストや辞書を操作することもあります。
Pythonのリストは内部的に配列として実装されているため、先頭付近の要素を削除する場合には要素のシフトコストがかかります。
ただし、末尾に対するpop()は低コストで済むため、スタックやキューの末尾操作には向いています。

辞書のpop()はキーの存在確認と削除が同時に行われます。
多くの要素が含まれる辞書であっても、キーを用いてアクセスできる利点があるため、通常は高速です。
ただし、削除や挿入を非常に頻繁に行うような特別なケースでは、データ構造を再検討することもあるかもしれません。

pop()に関するよくある質問

ここでは、pop()に関して初心者が疑問に思いやすい内容をまとめます。

1. 引数を指定しないpop()はリストと辞書で意味が違うの?

  • リストの場合: 引数を指定しないpop()は末尾の要素を削除して返す。
  • 辞書の場合: 引数無しのpop()は存在しない。辞書のpop()には最低でも削除したいキーが必要。

2. remove()とpop()で似た機能があるが、どちらを使えばいい?

  • リストで「インデックスを指定して削除したい」「戻り値を取得したい」ならpop()。
  • リストで「どのインデックスかはわからないけど、この値を削除したい」ならremove()。
  • 辞書ではpop()を用いて削除対象のキーを指定する形になる。

3. pop()を使わずにdel文で削除するのと何が違う?

  • del list[index]del dict[key] を使うと、削除はできるが削除した要素の値は戻り値として得られない。
  • pop()は削除した要素を戻り値として利用できるため、値を何らかの形で利用したいならpop()が便利。

4. pop()を連続して使うようなケースはある?

  • スタック的に要素を順番に処理していく場合、pop()を繰り返し呼び出すケースがある。
  • リストが空になったタイミングでエラーにならないように、ループ前に要素数をチェックするなどの対策を入れる場合が多い。

使いどころと学習のヒント

pop()は単純な機能に見えますが、実務でもよく使われるメソッドの一つです。
特にリストや辞書を操作する場面では、取得と削除が同時にできることで処理をスッキリ書けるのが魅力です。
また、複数の要素を削除するようなロジックを組むときには、pop()以外にremove()やpopitem()などのメソッドも併せて検討すると、よりシンプルなコードになることがあります。

pop()による削除対象が確実に存在しているかどうかなど、エラー処理を適切に組み込むと実務でも扱いやすくなります。

pop()のまとめコード集

最後に、リストと辞書それぞれのpop()の使い方を簡単に振り返りたい方のため、ポイントごとに整理したコード例をまとめておきます。

リスト編

# 1. 末尾の要素を削除し、値を取得
numbers = [1, 2, 3, 4]
val = numbers.pop()
# val -> 4, numbers -> [1, 2, 3]

# 2. 指定したインデックスの要素を削除
numbers = [10, 20, 30, 40]
val = numbers.pop(1)
# val -> 20, numbers -> [10, 30, 40]

# 3. スタック的に利用
stack = []
stack.append("A")
stack.append("B")
last = stack.pop()
# last -> "B", stack -> ["A"]

辞書編

# 1. 指定したキーを削除し、値を取得
config = {
    "debug": True,
    "theme": "dark"
}
val = config.pop("debug")
# val -> True, config -> {"theme": "dark"}

# 2. キーが存在しない場合のデフォルト値を設定
config = {
    "mode": "production"
}
val = config.pop("timeout", 30)
# timeoutが無いので val -> 30, config -> {"mode": "production"}

これらの例を参考にすると、pop()の使い方を素早く思い出せるでしょう。

まとめ

ここまで、Pythonのpop() メソッドを軸にして、リストと辞書への適用方法や実務での使い方、関連メソッドとの違いなどを紹介しました。

pop()は、削除と同時に削除対象の値を取得できるため、単純なデータの削除よりも一歩踏み込んだ処理が必要なときに便利です。
スタック処理や一時的なデータ保管の制御、あるいはログに残すなど、さまざまなシーンで活用することが考えられます。

いざコードを書く際、「この要素を削除して同時に値も使いたい」 と感じたら、ぜひpop()を検討してみてはいかがでしょうか。
また、似たようなメソッドとしてremove()やpopitem()も存在するため、それらとの使い分けを意識することで、より意図がはっきりしたコードを書くことができます。

pop()をうまく使いこなし、リストや辞書の操作をスムーズにしていきましょう。
実務でも活躍するシンプルながら強力なメソッドですので、ぜひ自分のプロジェクトでも取り入れてみてください。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。