メインコンテンツへスキップ
Lesson4 / 8

リストの要素を追加・削除する

目次

このレッスンで学ぶこと

  • 要素を追加する方法(append, insert, extend)
  • 要素を削除する方法(remove, pop, clear)
  • リストを変更する各種メソッド
  • 追加・削除の使い分け

リストの追加・削除とは

追加・削除は、リストの内容を動的に変更する操作です。プログラム実行中にデータを加えたり除いたりして、リストの内容を管理します。

メソッド説明戻り値
append(要素)末尾に1つ追加None
insert(位置, 要素)指定位置に挿入None
extend(リスト)複数要素を追加None
remove(値)値を削除None
pop(位置)インデックスで削除削除した値
clear()全削除None

主な特徴:

  • リストは可変(ミュータブル)なので、作成後に変更可能
  • 追加・削除は元のリストを直接変更する(破壊的操作)
  • append()とextend()の違いに注意(リストをそのまま追加 vs 展開して追加)
  • pop()だけが削除した値を返す

簡単なコード例:

Python
tasks = ["メール確認", "資料作成"]

# 追加
tasks.append("会議準備")
print(tasks)

# 削除
tasks.remove("メール確認")
print(tasks)

# 複数追加
tasks.extend(["報告書作成", "承認"])
print(tasks)

実行結果:

['メール確認', '資料作成', '会議準備']
['資料作成', '会議準備']
['資料作成', '会議準備', '報告書作成', '承認']

なぜ追加・削除が必要なのか?

プログラムの実行中にデータが変化するとき、リストに要素を追加したり削除したりする必要があります。

Python
# タスク管理
tasks = ["メール確認", "資料作成"]
print(f"初期タスク: {tasks}")

# タスクを追加
tasks.append("会議準備")
print(f"追加後: {tasks}")

# タスクを完了(削除)
tasks.remove("メール確認")
print(f"完了後: {tasks}")

実行結果:

初期タスク: ['メール確認', '資料作成']
追加後: ['メール確認', '資料作成', '会議準備']
完了後: ['資料作成', '会議準備']

💡 豆知識: Pythonのリストは動的配列として実装されており、要素の追加・削除が効率的に行えるように設計されています。


要素の追加

append() - 末尾に追加

機能: リストの末尾に1つの要素を追加します。

書き方:

Python
リスト.append(要素)

用途: データの順次追加、ログの記録、結果の蓄積

注意点:

  • 元のリストが変更される(破壊的操作)
  • 戻り値はNone
  • リストを追加すると入れ子になる
Python
fruits = ["りんご", "バナナ"]
print(f"初期: {fruits}")

fruits.append("オレンジ")
print(f"追加後: {fruits}")

fruits.append("ぶどう")
print(f"さらに追加: {fruits}")

実行結果:

初期: ['りんご', 'バナナ']
追加後: ['りんご', 'バナナ', 'オレンジ']
さらに追加: ['りんご', 'バナナ', 'オレンジ', 'ぶどう']

insert() - 指定位置に挿入

機能: 指定したインデックスの位置に要素を挿入します。

書き方:

Python
リスト.insert(インデックス, 要素)

用途: 特定位置への挿入、優先度付きリスト、ソート済みリストへの挿入

注意点:

  • 既存の要素は後ろにずれる
  • インデックスが範囲外でもエラーにならない
  • 負のインデックスも使える
Python
numbers = [1, 2, 4, 5]
print(f"初期: {numbers}")

# インデックス2に3を挿入
numbers.insert(2, 3)
print(f"挿入後: {numbers}")

# 先頭に挿入
numbers.insert(0, 0)
print(f"先頭に挿入: {numbers}")

実行結果:

初期: [1, 2, 4, 5]
挿入後: [1, 2, 3, 4, 5]
先頭に挿入: [0, 1, 2, 3, 4, 5]

extend() - 複数要素を追加

機能: 別のリストの全要素を末尾に追加します。

書き方:

Python
リスト.extend(別のリスト)

用途: リストの結合、複数データの一括追加

注意点:

  • appendと違い、要素が展開される
  • +演算子との違いに注意
  • 文字列を渡すと1文字ずつ追加される
Python
list1 = [1, 2, 3]
list2 = [4, 5, 6]

print(f"list1: {list1}")
print(f"list2: {list2}")

list1.extend(list2)
print(f"extend後: {list1}")

# appendとの違い
list3 = [1, 2, 3]
list3.append([4, 5, 6])
print(f"append使用: {list3}")

実行結果:

list1: [1, 2, 3]
list2: [4, 5, 6]
extend後: [1, 2, 3, 4, 5, 6]
append使用: [1, 2, 3, [4, 5, 6]]

要素の削除

remove() - 値で削除

機能: 指定した値の最初の出現を削除します。

書き方:

Python
リスト.remove()

用途: 特定値の削除、不要データの除去

注意点:

  • 値が存在しないとValueError
  • 最初の1つだけ削除される
  • 複数ある場合は最初のもののみ
Python
fruits = ["りんご", "バナナ", "オレンジ", "バナナ"]
print(f"初期: {fruits}")

fruits.remove("バナナ")
print(f"削除後: {fruits}")

# 存在しない値を削除しようとするとエラー
try:
    fruits.remove("メロン")
except ValueError as e:
    print(f"エラー: {e}")

実行結果:

初期: ['りんご', 'バナナ', 'オレンジ', 'バナナ']
削除後: ['りんご', 'オレンジ', 'バナナ']
エラー: list.remove(x): x not in list

pop() - インデックスで削除

機能: 指定したインデックスの要素を削除し、その値を返します。

書き方:

Python
= リスト.pop()        # 末尾を削除
= リスト.pop(インデックス)

用途: スタック操作、最後の要素の取得と削除、履歴管理

注意点:

  • 削除した値が返される
  • インデックス省略時は末尾
  • 空のリストではIndexError
Python
numbers = [1, 2, 3, 4, 5]
print(f"初期: {numbers}")

# 末尾を削除
last = numbers.pop()
print(f"削除した値: {last}")
print(f"削除後: {numbers}")

# インデックス1を削除
value = numbers.pop(1)
print(f"削除した値: {value}")
print(f"削除後: {numbers}")

実行結果:

初期: [1, 2, 3, 4, 5]
削除した値: 5
削除後: [1, 2, 3, 4]
削除した値: 2
削除後: [1, 3, 4]

clear() - 全削除

機能: リストの全要素を削除します。

書き方:

Python
リスト.clear()

用途: リストの初期化、データのクリア

注意点:

  • 空リストになる
  • リスト = [] とは異なる(同じオブジェクトを保持)
Python
numbers = [1, 2, 3, 4, 5]
print(f"初期: {numbers}")

numbers.clear()
print(f"クリア後: {numbers}")

実行結果:

初期: [1, 2, 3, 4, 5]
クリア後: []

del文 - インデックス・スライスで削除

機能: インデックスやスライスで要素を削除します。

書き方:

Python
del リスト[インデックス]
del リスト[開始:終了]

用途: 範囲削除、変数の削除

注意点:

  • 値は返されない
  • スライスで複数削除可能
Python
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(f"初期: {numbers}")

# インデックス2を削除
del numbers[2]
print(f"del [2]: {numbers}")

# スライスで削除
del numbers[2:5]
print(f"del [2:5]: {numbers}")

実行結果:

初期: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
del [2]: [0, 1, 3, 4, 5, 6, 7, 8, 9]
del [2:5]: [0, 1, 6, 7, 8, 9]

具体例

例1: ショッピングカート

Python
cart = []

# 商品を追加
cart.append("りんご")
cart.append("バナナ")
cart.append("牛乳")
print(f"カート: {cart}")

# 商品を削除
cart.remove("バナナ")
print(f"バナナ削除後: {cart}")

# さらに追加
cart.extend(["パン", "卵"])
print(f"追加後: {cart}")

実行結果:

カート: ['りんご', 'バナナ', '牛乳']
バナナ削除後: ['りんご', '牛乳']
追加後: ['りんご', '牛乳', 'パン', '卵']

例2: ToDoリスト

Python
todos = ["メール確認", "資料作成", "会議準備"]

print("=== ToDoリスト ===")
for i, todo in enumerate(todos, 1):
    print(f"{i}. {todo}")

# タスク完了(最初のタスクを削除)
completed = todos.pop(0)
print(f"\n完了: {completed}")

# 新しいタスクを追加
todos.append("報告書作成")

print("\n=== 更新後 ===")
for i, todo in enumerate(todos, 1):
    print(f"{i}. {todo}")

実行結果:

=== ToDoリスト ===
1. メール確認
2. 資料作成
3. 会議準備

完了: メール確認

=== 更新後 ===
1. 資料作成
2. 会議準備
3. 報告書作成

例3: 履歴管理

Python
history = []
max_history = 5

# 履歴を追加
actions = ["開く", "編集", "保存", "閉じる", "開く", "編集", "保存"]

for action in actions:
    history.append(action)

    # 最大数を超えたら古いものを削除
    if len(history) > max_history:
        history.pop(0)

    print(f"履歴: {history}")

実行結果:

履歴: ['開く']
履歴: ['開く', '編集']
履歴: ['開く', '編集', '保存']
履歴: ['開く', '編集', '保存', '閉じる']
履歴: ['開く', '編集', '保存', '閉じる', '開く']
履歴: ['編集', '保存', '閉じる', '開く', '編集']
履歴: ['保存', '閉じる', '開く', '編集', '保存']

例4: フィルタリング

Python
# 0を除去
numbers = [1, 0, 2, 0, 3, 0, 4, 5]
print(f"元のリスト: {numbers}")

# 0をすべて削除
while 0 in numbers:
    numbers.remove(0)

print(f"0削除後: {numbers}")

実行結果:

元のリスト: [1, 0, 2, 0, 3, 0, 4, 5]
0削除後: [1, 2, 3, 4, 5]

例5: スタック操作

Python
# スタック(後入れ先出し)
stack = []

# プッシュ(追加)
stack.append(1)
stack.append(2)
stack.append(3)
print(f"スタック: {stack}")

# ポップ(取り出し)
print(f"pop: {stack.pop()}")
print(f"pop: {stack.pop()}")
print(f"残り: {stack}")

実行結果:

スタック: [1, 2, 3]
pop: 3
pop: 2
残り: [1]

例6: キュー操作

Python
# キュー(先入れ先出し)
queue = []

# エンキュー(追加)
queue.append("A")
queue.append("B")
queue.append("C")
print(f"キュー: {queue}")

# デキュー(取り出し)
print(f"dequeue: {queue.pop(0)}")
print(f"dequeue: {queue.pop(0)}")
print(f"残り: {queue}")

実行結果:

キュー: ['A', 'B', 'C']
dequeue: A
dequeue: B
残り: ['C']

メソッドの使い分け

追加メソッドの比較

Python
# append: 1つの要素を末尾に
list1 = [1, 2, 3]
list1.append(4)
print(f"append: {list1}")

# insert: 指定位置に挿入
list2 = [1, 2, 3]
list2.insert(1, 1.5)
print(f"insert: {list2}")

# extend: 複数要素を末尾に
list3 = [1, 2, 3]
list3.extend([4, 5])
print(f"extend: {list3}")

# + 演算子: 新しいリストを作成
list4 = [1, 2, 3]
list5 = list4 + [4, 5]
print(f"+演算子: {list5}")
print(f"元のリスト: {list4}")

実行結果:

append: [1, 2, 3, 4]
insert: [1, 1.5, 2, 3]
extend: [1, 2, 3, 4, 5]
+演算子: [1, 2, 3, 4, 5]
元のリスト: [1, 2, 3]

削除メソッドの比較

Python
# remove: 値で削除
list1 = [1, 2, 3, 2, 4]
list1.remove(2)
print(f"remove: {list1}")

# pop: インデックスで削除(値を返す)
list2 = [1, 2, 3, 4, 5]
value = list2.pop(2)
print(f"pop: {list2}, 削除した値: {value}")

# del: インデックスで削除(値を返さない)
list3 = [1, 2, 3, 4, 5]
del list3[2]
print(f"del: {list3}")

# clear: 全削除
list4 = [1, 2, 3, 4, 5]
list4.clear()
print(f"clear: {list4}")

実行結果:

remove: [1, 3, 2, 4]
pop: [1, 2, 4, 5], 削除した値: 3
del: [1, 2, 4, 5]
clear: []

よくある間違い

間違い1: append()の戻り値

Python
# 間違い: append()はNoneを返す
numbers = [1, 2, 3]
result = numbers.append(4)
print(f"戻り値: {result}")
print(f"リスト: {numbers}")

# 正しい
numbers = [1, 2, 3]
numbers.append(4)
print(f"リスト: {numbers}")

実行結果:

戻り値: None
リスト: [1, 2, 3, 4]
リスト: [1, 2, 3, 4]

間違い2: appendとextendの混同

Python
# appendはそのまま追加
list1 = [1, 2, 3]
list1.append([4, 5])
print(f"append: {list1}")

# extendは展開して追加
list2 = [1, 2, 3]
list2.extend([4, 5])
print(f"extend: {list2}")

実行結果:

append: [1, 2, 3, [4, 5]]
extend: [1, 2, 3, 4, 5]

間違い3: ループ中の削除

Python
# 危険: ループ中の削除
numbers = [1, 2, 3, 4, 5]
for num in numbers:
    if num % 2 == 0:
        numbers.remove(num)  # 予期しない動作

print(f"結果: {numbers}")

# 正しい: 新しいリストを作る
numbers = [1, 2, 3, 4, 5]
numbers = [num for num in numbers if num % 2 != 0]
print(f"正しい結果: {numbers}")

実行結果:

結果: [1, 3, 4, 5]
正しい結果: [1, 3, 5]

間違い4: remove()で全削除

Python
# 間違い: 最初の1つだけ削除される
numbers = [1, 2, 2, 3, 2, 4]
numbers.remove(2)
print(f"remove 1回: {numbers}")

# 全削除するにはループ
numbers = [1, 2, 2, 3, 2, 4]
while 2 in numbers:
    numbers.remove(2)
print(f"全削除: {numbers}")

実行結果:

remove 1回: [1, 2, 3, 2, 4]
全削除: [1, 3, 4]

間違い5: pop()の範囲外

Python
# 空リストでpop()
empty = []
try:
    empty.pop()
except IndexError:
    print("空リストではpop()できません")

# 範囲外のインデックス
numbers = [1, 2, 3]
try:
    numbers.pop(10)
except IndexError:
    print("インデックス範囲外")

実行結果:

空リストではpop()できません
インデックス範囲外

練習問題

問題1(基礎)⭐☆☆

空のリストを作り、1, 2, 3を順番に追加してください。

💡 ヒント

append()を使います。

✅ 解答例
Python
numbers = []
numbers.append(1)
numbers.append(2)
numbers.append(3)
print(numbers)

実行結果:

[1, 2, 3]

問題2(基礎)⭐☆☆

リスト ["A", "B", "C", "D"] から"B"を削除してください。

💡 ヒント

remove()を使います。

✅ 解答例
Python
items = ["A", "B", "C", "D"]
items.remove("B")
print(items)

実行結果:

['A', 'C', 'D']

問題3(応用)⭐⭐☆

リスト [1, 2, 3] とリスト [4, 5, 6] を結合してください。

💡 ヒント

extend()または+演算子を使います。

✅ 解答例
Python
list1 = [1, 2, 3]
list2 = [4, 5, 6]

# 方法1: extend
list1.extend(list2)
print(list1)

# 方法2: +演算子
list3 = [1, 2, 3]
list4 = [4, 5, 6]
result = list3 + list4
print(result)

実行結果:

[1, 2, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]

まとめ

このレッスンでは、リストへの要素追加と削除の基本操作を学びました。

  • append, insert, extend で用途に応じた追加ができます。
  • remove, pop, del で削除方法を目的別に使い分けられます。
  • 操作対象が存在しない場合のエラーと対処方法を理解しました。
  • 要素位置と値指定の違いを意識して実装できるようになりました。
  • 更新前後のリストを確認しながら処理することが重要です。