Python: リストの基本と操作
最終更新:2026-09-22
これまでのレッスンでは、変数は 1 つの値しか保持できませんでした。しかし現実のデータが単体で存在することはめったにありません——買い物かごには複数のアイテム、リーダーボードには複数のエントリ、記事には複数の段落があります。リストは「データの集まり」を保持するために設計されています。Python で最も柔軟でよく使われるデータ構造です。
1. リストとは
リストは角括弧 [] で定義し、要素をカンマで区切ります。異なる型の要素を保持できます:
# 整数のリスト
numbers = [1, 2, 3, 4, 5]
# stringのリスト
fruits = ["apple", "banana", "orange"]
# 混在type
mixed = [1, "hello", True, 3.14]
# 空のリスト
empty = []
print(numbers) # [1, 2, 3, 4, 5]
print(fruits) # ['apple', 'banana', 'orange']
print(empty) # []
2. インデックスアクセス
リストのインデックスは文字列とまったく同じように機能します——0 から始まり、負のインデックスをサポートします:
fruits = ["apple", "banana", "orange", "grape", "watermelon"]
# 正のインデックス:0 から始まる
print(fruits[0]) # apple
print(fruits[2]) # orange
print(fruits[4]) # watermelon
# 負のインデックス:-1 から始まる(最後)
print(fruits[-1]) # watermelon
print(fruits[-2]) # grape
print(fruits[-5]) # apple
範囲外のインデックスにアクセスするとエラーになります:
# print(fruits[10]) # IndexError: list index out of range
▶ サンプル:リスト要素情報の取得(難易度 ⭐)
▶ 試してみよう出力:
# 执行成功
3. リストの CRUD 操作
リストはミュータブル(変更可能)です——文字列とは異なり、その場で変更できます。
(1) 要素の追加
# append() — 末尾に追加
cities = ["Beijing", "Shanghai"]
cities.append("Guangzhou")
print(cities) # ['Beijing', 'Shanghai', 'Guangzhou']
# insert() — 特定の位置に挿入
cities.insert(1, "Shenzhen")
print(cities) # ['Beijing', 'Shenzhen', 'Shanghai', 'Guangzhou']
# extend() — 別のリストをマージ
more_cities = ["Hangzhou", "Chengdu"]
cities.extend(more_cities)
print(cities) # ['Beijing', 'Shenzhen', 'Shanghai', 'Guangzhou', 'Hangzhou', 'Chengdu']
(2) 要素の削除
# pop() — 指定位置の要素を削除して返す(デフォルトは最後)
cities = ["Beijing", "Shanghai", "Guangzhou", "Shenzhen"]
last = cities.pop() # 最後を削除して返す
print(f"Removed: {last}") # Shenzhen
print(cities) # ['Beijing', 'Shanghai', 'Guangzhou']
first = cities.pop(0) # 最初を削除
print(f"Removed: {first}") # Beijing
print(cities) # ['Shanghai', 'Guangzhou']
# remove() — 最初に一致するvalueを削除
cities = ["Beijing", "Shanghai", "Guangzhou", "Shanghai"]
cities.remove("Shanghai") # 最初の「Shanghai」のみ削除
print(cities) # ['Beijing', 'Guangzhou', 'Shanghai']
# clear() — すべての要素を削除
cities.clear()
print(cities) # []
(3) 要素の変更
scores = [60, 70, 80, 90]
scores[2] = 85 # 3 番目を 85 に変更
print(scores) # [60, 70, 85, 90]
(4) 要素の検索
# in — 要素の存在を確認
fruits = ["apple", "banana", "orange"]
print("apple" in fruits) # True
print("grape" in fruits) # False
# index() — 位置を検索
print(fruits.index("banana")) # 1
# print(fruits.index("grape")) # ValueError!
index() を使うとエラーになります。安全に確認するには、最初に in を使いましょう。
▶ サンプル:買い物かご管理(難易度 ⭐⭐)
▶ 試してみよう出力:
Cart: ['apple', 'milk', 'bread', 'apple']
Total items: 4
After update: ['apple (2-pack)', 'milk', 'bread', 'apple']
Removed: apple
Final cart: ['apple (2-pack)', 'milk', 'bread']
4. ソートと反転
numbers = [3, 1, 4, 1, 5, 9, 2]
# sort() — その場でソート(元のリストを変更)
numbers.sort()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# sort(reverse=True) — 降順
numbers.sort(reverse=True)
print(numbers) # [9, 5, 4, 3, 2, 1, 1]
# reverse() — 順序を反転
numbers.reverse()
print(numbers) # [1, 1, 2, 3, 4, 5, 9]
# sorted() — 新しいリストを返し、元のリストは変更しない
numbers = [3, 1, 4, 1, 5]
sorted_nums = sorted(numbers)
print(sorted_nums) # [1, 1, 3, 4, 5]
print(numbers) # [3, 1, 4, 1, 5](変更なし)
5. リストのスライス
スライスは文字列と同じように機能します:list[start:end:step]
nums = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(nums[2:6]) # [2, 3, 4, 5]
print(nums[:4]) # [0, 1, 2, 3] — 最初の 4 つ
print(nums[6:]) # [6, 7, 8, 9] — 6 から最後まで
print(nums[::2]) # [0, 2, 4, 6, 8] — 1 つおき
print(nums[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0] — 反転
スライスは代入もサポートしています——リストのユニークな機能です:
nums = [0, 1, 2, 3, 4, 5]
# スライスを置換
nums[1:4] = [10, 20, 30]
print(nums) # [0, 10, 20, 30, 4, 5]
# スライスを削除
nums[1:4] = []
print(nums) # [0, 4, 5]
▶ サンプル:スライスを使ったページネーション(難易度 ⭐⭐)
▶ 試してみよう出力:
Page 1: ['Item A', 'Item B', 'Item C']
Page 2: ['Item D', 'Item E', 'Item F']
Page 3: ['Item G']
6. ネストしたリスト
リストの要素自体をリストにすることができます——これをネストしたリスト(または 2D リスト)と呼びます。
# 3x4 の「行列」
matrix = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
]
# アクセス:最初に行、次に列
print(matrix[0]) # [1, 2, 3, 4] — 最初の行
print(matrix[1][2]) # 7 — 2 行目、3 列目
print(matrix[2][0]) # 9 — 3 行目、1 列目
▶ サンプル:学生スコア表(難易度 ⭐⭐⭐)
▶ 試してみよう出力:
Alice: Average 85.0
Bob: Average 91.0
Charlie: Average 81.0
Math scores:
Alice: 85
Bob: 90
Charlie: 76
7. よくあるユースケース
- To-Do リスト:
append()でタスク追加、pop()で完了して削除、sort()で優先順位付け - キュー:先入れ先出し——
append()でエンキュー、pop(0)でデキュー - データ収集:ループ内で
append()した結果を一括分析 - ページネーション:スライス
list[start:end]でデータのページ分割 - 行列演算:2D リストでテーブルデータを行と列のインデックスでアクセス
❓ よくある質問
len()、in 演算子をサポートします。append() は引数全体を 1 つの要素として追加します——リストを渡すと、ネストしたリストになります。extend() は引数の各要素を個別に追加します。a = [1,2]; a.append([3,4]) は [1,2,[3,4]]、a.extend([3,4]) は [1,2,3,4] になります。remove() しようとするとどうなりますか?ValueError が発生します。最初に in で確認しましょう:if "xxx" in my_list: my_list.remove("xxx")。またはリスト内包表記で新しいフィルタリング済みリストを作成:new_list = [x for x in my_list if x != "xxx"](次のレッスンで学びます)。📖 まとめ
- リストは
[]を使用。順序付けられ、ミュータブル、重複可能、異なる型を保持可能 - インデックスは 0 から始まり、負のインデックスをサポート。スライスは文字列と同じ
- 追加:
append()で末尾、insert()で位置指定、extend()でマージ - 削除:
pop()は削除して返す、remove()は値で削除、clear()は全削除 - 変更:
list[index] = new_value - 確認:
inで存在確認、index()で位置確認 - ソート:
sort()はその場で、sorted()は新しいリストを返す - ネストしたリストで 2D データ構造を実現。
list[row][col]でアクセス
📝 練習問題
-
基本(難易度 ⭐):好きな映画 5 つのリストを作成してください。
append()で新しいものを追加、pop()で最後のものを削除、sort()でアルファベット順にソートし、リストの長さを出力してください。 -
中級(難易度 ⭐⭐):
numbers = [23, 45, 12, 67, 34, 89, 5, 18]として、最大値、最小値、合計、平均を求めて出力してください。ヒント:max()、min()、sum()、len()などの組み込み関数を使用。 -
挑戦(難易度 ⭐⭐⭐):「To-Do リストマネージャー」を書いてください。リストでタスクを保存します。以下をサポート:
add:Buy milk、done:2(番号で削除)、list(すべて表示)。while Trueで継続的にコマンドを受け付け、exitで終了します。ヒント:split(":")でコマンドを解析。