リストの要素を変更しよう

学習の目標

本章では、以下の内容を学習します。

  • リストの要素を変更する方法を理解する
  • append()メソッドで要素を追加する方法を習得する
  • insert()メソッドで指定位置に要素を追加する方法を学ぶ
  • remove()メソッドで要素を削除する方法を理解する
  • pop()メソッドで要素を取り出す方法を習得する

リストは変更可能なデータ構造

前章でリストの基本的な操作を学びました。 リストの大きな特徴の一つは、作成した後でも内容を自由に変更できることです。

これまで扱ってきた文字列や数値などのデータは、一度作成すると変更することができません。 例えば、文字列「こんにちは」を「おはよう」に変更することはできません。 しかし、リストは作成後でも要素の値を変更したり、新しい要素を追加したり、不要な要素を削除したりすることが可能です。

この特徴により、プログラムの実行中にデータの内容を動的に変更できるため、より柔軟なプログラムを作成することができます。 今回は、リストを変更するための様々な方法を一つずつ学んでいきましょう。

既存の要素を変更する

まず、すでにリストに存在する要素の値を変更する方法から学んでいきます。 これは最もシンプルなリストの変更方法です。

既存の要素を変更するには、変更したい要素のインデックスを指定して、新しい値を代入します。 代入の方法は変数に値を代入する時と同じように、等号(=)を使用します。

VS Codeで新しいファイル list_modify.py を作成して、以下のコードを入力してみましょう。

# 果物のリストを作成
fruits = ["りんご", "バナナ", "オレンジ"]
print("変更前:", fruits)
# 2番目の要素(インデックス1)を変更
fruits[1] = "いちご"
print("変更後:", fruits)

このプログラムでは、最初に3つの果物を含むリストを作成しています。 そして、インデックス1(2番目の要素)である「バナナ」を「いちご」に変更しています。 fruits[1] = "いちご"という記述により、指定した位置の要素だけが新しい値に置き換わります。

このプログラムをターミナルで実行してみてください。

python list_modify.py

実行結果は以下のようになります。

変更前: ['りんご', 'バナナ', 'オレンジ']
変更後: ['りんご', 'いちご', 'オレンジ']

実行結果を見ると、インデックス1の位置にあった「バナナ」が「いちご」に変更されていることが確認できます。 他の要素(「りんご」と「オレンジ」)は変更されずにそのまま残っています。

複数の要素を変更する

一度に複数の要素を変更したい場合は、それぞれのインデックスを指定して個別に代入します。 次のコードを追記して、複数の要素を変更する例を見てみましょう。

# 学生の成績リスト
scores = [70, 80, 60, 90]
print("変更前の成績:", scores)
# 複数の成績を更新
scores[0] = 75 # 1番目の学生の成績を更新
scores[2] = 65 # 3番目の学生の成績を更新
print("変更後の成績:", scores)

このコードでは、4人の学生の成績を管理するリストを作成し、そのうち2人の成績を変更しています。 scores[0] = 75でインデックス0の成績を70から75に変更し、scores[2] = 65でインデックス2の成績を60から65に変更しています。 このように、異なるインデックスを指定することで、複数の要素をそれぞれ異なる値に変更することができます。

実行結果は以下のようになります。

変更前の成績: [70, 80, 60, 90]
変更後の成績: [75, 80, 65, 90]

変更を指定した1番目と3番目の成績だけが更新され、2番目と4番目の成績はそのまま保持されていることが分かります。

append()メソッドで要素を追加

リストの末尾に新しい要素を追加するには、append()メソッドを使用します。 メソッドとは、リストに定義されている機能のことで、ピリオド(.)に続けて呼び出します。

append()メソッドは、引数として渡した値をリストの最後に追加します。 元のリストの要素はそのまま保持され、新しい要素が末尾に加わることでリストの長さが1つ増加します。

まず、空のリストから始めて段階的に要素を追加する例を見てみましょう。

# 空の買い物リストから始める
shopping_list = []
print("初期状態:", shopping_list)
print("要素数:", len(shopping_list))
# 商品を一つずつ追加
shopping_list.append("牛乳")
print("牛乳追加後:", shopping_list)
print("要素数:", len(shopping_list))
shopping_list.append("パン")
print("パン追加後:", shopping_list)
print("要素数:", len(shopping_list))
shopping_list.append("卵")
print("卵追加後:", shopping_list)
print("要素数:", len(shopping_list))

このコードでは、最初に空のリスト(要素が何も入っていないリスト)を作成しています。 その後、append()メソッドを使って一つずつ要素を追加し、それぞれの段階でリストの状態と要素数を確認しています。 len()関数を使ってリストの長さを表示することで、要素が追加されるたびにリストが大きくなっていることを確認できます。

実行結果は以下のようになります。

初期状態: []
要素数: 0
牛乳追加後: ['牛乳']
要素数: 1
パン追加後: ['牛乳', 'パン']
要素数: 2
卵追加後: ['牛乳', 'パン', '卵']
要素数: 3

この実行結果から、append()メソッドを使うたびに新しい要素がリストの最後に追加され、要素数も1つずつ増加していることが確認できます。

既存のリストに要素を追加

空のリストだけでなく、すでに要素が入っているリストにもappend()で要素を追加できます。

# 既存のリストに要素を追加
numbers = [1, 2, 3]
print("追加前:", numbers)
numbers.append(4)
numbers.append(5)
print("追加後:", numbers)
print("最終的な要素数:", len(numbers))

このコードでは、最初から3つの数値が入ったリストに対して、さらに2つの数値を追加しています。 既存の要素はそのまま保持され、新しい要素が末尾に順番に追加されていきます。

実行結果は以下のようになります。

追加前: [1, 2, 3]
追加後: [1, 2, 3, 4, 5]
最終的な要素数: 5

元々3つの要素があったリストに2つの要素が追加され、合計5つの要素を持つリストになりました。

insert()メソッドで指定位置に追加

append()メソッドは常にリストの末尾に要素を追加しますが、リストの特定の位置に要素を挿入したい場合はinsert()メソッドを使用します。

insert()メソッドは2つの引数を取ります。 第1引数には挿入したい位置のインデックスを、第2引数には挿入する値を指定します。 指定した位置に新しい要素が挿入され、それ以降の要素は自動的に後ろにずれます。

# 学生のリストを作成
students = ["田中", "佐藤", "高橋"]
print("挿入前:", students)
print("要素数:", len(students))
# インデックス1の位置(佐藤の前)に鈴木を挿入
students.insert(1, "鈴木")
print("鈴木挿入後:", students)
print("要素数:", len(students))
# インデックス0の位置(最初)に山田を挿入
students.insert(0, "山田")
print("山田挿入後:", students)
print("要素数:", len(students))

このコードでは、最初に3人の学生名を含むリストを作成しています。 まずstudents.insert(1, "鈴木")で、インデックス1の位置(「佐藤」の位置)に「鈴木」を挿入します。 この時、「佐藤」と「高橋」は自動的に後ろにずれます。

次にstudents.insert(0, "山田")で、インデックス0の位置(リストの最初)に「山田」を挿入します。 この場合、既存のすべての要素が後ろにずれることになります。

実行結果は以下のようになります。

挿入前: ['田中', '佐藤', '高橋']
要素数: 3
鈴木挿入後: ['田中', '鈴木', '佐藤', '高橋']
要素数: 4
山田挿入後: ['山田', '田中', '鈴木', '佐藤', '高橋']
要素数: 5

実行結果を見ると、insert()メソッドによって指定した位置に新しい要素が挿入され、既存の要素は削除されることなく後ろにずれていることが分かります。

末尾への挿入

insert()メソッドを使って末尾に要素を追加することもできます。 リストの長さと同じインデックスを指定すると、末尾に要素が追加されます。

colors = ["赤", "青"]
print("追加前:", colors)
# len(colors)は2なので、インデックス2の位置(末尾)に追加
colors.insert(len(colors), "緑")
print("追加後:", colors)

このコードでは、2つの要素を持つリストに対して、insert(len(colors), "緑")で末尾に要素を追加しています。 len(colors)は2を返すので、インデックス2の位置(末尾)に「緑」が追加されます。

実行結果は以下のようになります。

追加前: ['赤', '青']
追加後: ['赤', '青', '緑']

ただし、末尾に要素を追加する場合はappend()の方がシンプルで分かりやすいため、通常はappend()を使用することをお勧めします。

remove()メソッドで要素を削除

リストから特定の値を削除するには、remove()メソッドを使用します。 remove()メソッドは、削除したい値を引数として受け取り、その値と最初に一致する要素をリストから削除します。

このメソッドの特徴は、インデックスではなく値を指定して削除することです。 つまり、「3番目の要素を削除」ではなく、「"バナナ"という値を削除」という指定方法になります。

# 果物のリストから要素を削除
fruits = ["りんご", "バナナ", "オレンジ", "バナナ"]
print("削除前:", fruits)
print("要素数:", len(fruits))
# バナナを削除(最初に見つかった1つだけ)
fruits.remove("バナナ")
print("バナナ削除後:", fruits)
print("要素数:", len(fruits))
# オレンジを削除
fruits.remove("オレンジ")
print("オレンジ削除後:", fruits)
print("要素数:", len(fruits))

このコードでは、「バナナ」が2回含まれているリストを作成しています。 fruits.remove("バナナ")を実行すると、リストの中で最初に見つかった「バナナ」だけが削除されます。 同じ値が複数ある場合でも、remove()メソッドは一度に1つの要素しか削除しません。

実行結果は以下のようになります。

削除前: ['りんご', 'バナナ', 'オレンジ', 'バナナ']
要素数: 4
バナナ削除後: ['りんご', 'オレンジ', 'バナナ']
要素数: 3
オレンジ削除後: ['りんご', 'バナナ']
要素数: 2

実行結果を見ると、最初のremove("バナナ")で2番目の「バナナ」が削除され、4番目の「バナナ」は残っていることが分かります。

存在しない要素を削除しようとした場合

リストに存在しない値を削除しようとすると、ValueError(値エラー)が発生します。 このエラーを避けるために、削除前に要素が存在するかどうかを確認することができます。

numbers = [1, 2, 3]
print("リスト:", numbers)
# 削除前に存在確認
if 4 in numbers:
numbers.remove(4)
print("4を削除しました")
else:
print("4は存在しません")
# 実際に存在する値を削除
if 2 in numbers:
numbers.remove(2)
print("2を削除しました")
print("削除後のリスト:", numbers)

このコードでは、in演算子を使って値がリストに含まれているかどうかを事前に確認しています。 4 in numbersは「4がnumbersリストに含まれているか」を調べ、含まれていればTrue、含まれていなければFalseを返します。 この確認を行うことで、エラーを発生させることなく安全に削除処理を実行できます。

実行結果は以下のようになります。

リスト: [1, 2, 3]
4は存在しません
2を削除しました
削除後のリスト: [1, 3]

pop()メソッドで要素を取り出し

pop()メソッドは、リストから要素を削除すると同時に、削除された要素の値を取得することができる便利なメソッドです。 remove()メソッドとの違いは、削除した要素の値を戻り値として受け取れることです。

pop()メソッドは引数を指定しない場合は最後の要素を取り出し、インデックスを指定した場合はその位置の要素を取り出します。 取り出された要素はリストから削除され、その値を変数に保存して後で使用することができます。

# 作業リストを作成
tasks = ["メール確認", "会議参加", "資料作成", "報告書提出"]
print("作業リスト:", tasks)
print("要素数:", len(tasks))
# 最後のタスクを取り出し
completed_task = tasks.pop()
print(f"完了したタスク: {completed_task}")
print("残りのタスク:", tasks)
print("残り要素数:", len(tasks))
# 最初のタスクを取り出し
next_task = tasks.pop(0)
print(f"次のタスク: {next_task}")
print("残りのタスク:", tasks)
print("残り要素数:", len(tasks))

このコードでは、4つのタスクを含むリストを作成しています。 まずtasks.pop()で引数を指定せずに呼び出すことで、最後の要素「報告書提出」を取り出しています。 取り出された値はcompleted_task変数に保存され、元のリストからは削除されます。

次にtasks.pop(0)でインデックス0を指定して、最初の要素「メール確認」を取り出しています。 この場合も取り出された値がnext_task変数に保存され、リストからは削除されます。

実行結果は以下のようになります。

作業リスト: ['メール確認', '会議参加', '資料作成', '報告書提出']
要素数: 4
完了したタスク: 報告書提出
残りのタスク: ['メール確認', '会議参加', '資料作成']
残り要素数: 3
次のタスク: メール確認
残りのタスク: ['会議参加', '資料作成']
残り要素数: 2

この実行結果から、pop()メソッドによって要素が削除されると同時に、その値を取得できていることが確認できます。

空のリストからpop()しようとした場合

空のリスト(要素が何もないリスト)に対してpop()メソッドを実行すると、IndexError(インデックスエラー)が発生します。 このエラーを避けるために、事前にリストの長さを確認することが重要です。

empty_list = []
print("空のリスト:", empty_list)
# 空のリストから要素を取り出そうとするとエラーになるので事前確認
if len(empty_list) > 0:
item = empty_list.pop()
print(f"取り出した要素: {item}")
else:
print("リストが空のため、取り出せません")
# 要素があるリストの場合
numbers = [10, 20, 30]
if len(numbers) > 0:
last_number = numbers.pop()
print(f"取り出した数値: {last_number}")
print(f"残りのリスト: {numbers}")

このコードでは、len()関数を使ってリストの長さを確認してからpop()メソッドを実行しています。 リストの長さが0より大きい場合のみpop()を実行することで、エラーの発生を防いでいます。

実行結果は以下のようになります。

空のリスト: []
リストが空のため、取り出せません
取り出した数値: 30
残りのリスト: [10, 20]

まとめ

本章では、リストの要素を変更する様々な方法について学習しました。 理解できた内容は以下の通りです。

インデックスを指定して既存の要素を新しい値に変更する方法を学びました。 この方法では、指定した位置の要素だけが変更され、他の要素は影響を受けません。

append()メソッドを使ってリストの末尾に新しい要素を追加する方法を習得しました。 このメソッドは最もよく使用される要素追加の方法です。

また、insert()メソッドを使って指定した位置に要素を挿入する方法を理解しました。 挿入された位置以降の要素は自動的に後ろにずれます。

remove()メソッドで特定の値を持つ要素を削除する方法を学び、存在しない値を削除しようとするとエラーが発生することも理解しました。

さらに、pop()メソッドを使って要素を削除しながら同時にその値を取得する方法を習得しました。 この方法は削除された要素の値を後で使用したい場合に便利です。

これらの操作には共通してエラーが発生する可能性があるため、事前の確認処理の重要性も学びました。 これで、リストを動的に管理するための基本的な技術が身につきました。

このセクションは有料サブスクリプションへの登録、またはログインが必要です。完全なコンテンツにアクセスするには、料金ページ(/pricing)をご覧ください。購入済みの場合は、ログインしてください。

Starterプランでより詳しく学習

この先のコンテンツを読むにはStarterプラン以上が必要です。より詳細な解説、実践的なサンプルコード、演習問題にアクセスして学習を深めましょう。

作成者:とまだ
Previous
リストの基本操作を学ぼう