プログラミングをしていると、こんな場面に出会うことがあります:
- 「クラス全員の成績を管理したい」
- 「お気に入りの映画リストを作りたい」
- 「毎日の気温データを記録したい」
- 「複数のユーザー名を一度に処理したい」
こんなとき、変数を1つずつ作るのは大変ですよね。そこで活躍するのがリスト(list)です。
リストを使えば、関連するデータをひとまとめにして、効率的に管理・操作できます。
この記事では、Python初心者の方にもわかりやすく、リストの基本から実践的な使い方まで詳しく解説します。
Pythonのリストとは?

リストの基本概念
リストとは、複数の値を順番に並べて、1つの変数で管理できるデータ型です。
日常生活で例えるなら:
- 買い物リスト:牛乳、パン、卵、りんご
- 成績表:数学85点、英語92点、理科78点
- 友達リスト:太郎、花子、次郎、三郎
これをPythonで表現すると:
shopping_list = ["牛乳", "パン", "卵", "りんご"]
scores = [85, 92, 78]
friends = ["太郎", "花子", "次郎", "三郎"]
リストの特徴
特徴 | 詳細説明 |
---|---|
順序がある | 要素には0から始まる番号(インデックス)が付く |
変更可能 | 後から要素を追加・削除・変更できる |
異なる型OK | 文字列と数値を混在させることも可能 |
重複OK | 同じ値を複数回含むことができる |
実際の例で確認
# 基本的なリスト
fruits = ["りんご", "バナナ", "みかん"]
# 異なる型を混在
mixed_list = ["太郎", 25, True, 3.14]
# 重複を含むリスト
numbers = [1, 2, 2, 3, 2, 1]
print(fruits) # ['りんご', 'バナナ', 'みかん']
print(mixed_list) # ['太郎', 25, True, 3.14]
print(numbers) # [1, 2, 2, 3, 2, 1]
リストは関連するデータをひとまとめにして管理できる、Pythonでもっとも使用頻度の高いデータ型です。
リストの基本操作

インデックスによる要素の取得
リストの各要素には、0から始まる番号(インデックス)が付いています:
fruits = ["りんご", "バナナ", "みかん", "いちご"]
# 0 1 2 3
print(fruits[0]) # りんご(最初の要素)
print(fruits[1]) # バナナ
print(fruits[3]) # いちご(最後の要素)
負のインデックス
後ろから数えるときは負の数を使います:
fruits = ["りんご", "バナナ", "みかん", "いちご"]
# -4 -3 -2 -1
print(fruits[-1]) # いちご(最後の要素)
print(fruits[-2]) # みかん(後ろから2番目)
スライスによる複数要素の取得
範囲を指定して複数の要素を取得できます:
fruits = ["りんご", "バナナ", "みかん", "いちご", "ぶどう"]
print(fruits[1:4]) # ['バナナ', 'みかん', 'いちご']
print(fruits[:3]) # ['りんご', 'バナナ', 'みかん'] (最初から3番目まで)
print(fruits[2:]) # ['みかん', 'いちご', 'ぶどう'] (2番目から最後まで)
print(fruits[:]) # 全要素のコピー
要素の変更
既存の要素を新しい値に変更できます:
fruits = ["りんご", "バナナ", "みかん"]
print("変更前:", fruits)
fruits[1] = "メロン"
print("変更後:", fruits) # ['りんご', 'メロン', 'みかん']
リストの長さを調べる
len()
関数でリストの要素数がわかります:
fruits = ["りんご", "バナナ", "みかん"]
print(f"要素数: {len(fruits)}") # 要素数: 3
インデックスを使って要素にアクセスし、スライスで範囲指定、len()で長さを確認できます。
リストの要素を追加・削除する方法

要素の追加
末尾に1つ追加:
fruits = ["りんご", "バナナ"]
fruits.append("みかん")
print(fruits) # ['りんご', 'バナナ', 'みかん']
指定位置に挿入:
fruits = ["りんご", "みかん"]
fruits.insert(1, "バナナ") # 1番目に挿入
print(fruits) # ['りんご', 'バナナ', 'みかん']
複数の要素を一度に追加:
fruits = ["りんご"]
fruits.extend(["バナナ", "みかん", "いちご"])
print(fruits) # ['りんご', 'バナナ', 'みかん', 'いちご']
要素の削除
値を指定して削除:
fruits = ["りんご", "バナナ", "みかん"]
fruits.remove("バナナ")
print(fruits) # ['りんご', 'みかん']
インデックスを指定して削除:
fruits = ["りんご", "バナナ", "みかん"]
del fruits[1] # 1番目を削除
print(fruits) # ['りんご', 'みかん']
末尾の要素を取り出して削除:
fruits = ["りんご", "バナナ", "みかん"]
last_fruit = fruits.pop() # 取り出して削除
print(f"取り出した果物: {last_fruit}") # みかん
print(f"残った果物: {fruits}") # ['りんご', 'バナナ']
指定位置の要素を取り出して削除:
fruits = ["りんご", "バナナ", "みかん"]
second_fruit = fruits.pop(1) # 1番目を取り出し
print(f"取り出した果物: {second_fruit}") # バナナ
print(f"残った果物: {fruits}") # ['りんご', 'みかん']
全要素を削除:
fruits = ["りんご", "バナナ", "みかん"]
fruits.clear()
print(fruits) # []
append()、insert()、extend()で追加、remove()、del、pop()、clear()で削除できます。
リストの便利なメソッド

検索と数える
fruits = ["りんご", "バナナ", "りんご", "みかん", "りんご"]
# 特定の値を検索
index = fruits.index("バナナ")
print(f"バナナの位置: {index}") # バナナの位置: 1
# 特定の値の出現回数を数える
count = fruits.count("りんご")
print(f"りんごの個数: {count}") # りんごの個数: 3
# 値が含まれているかチェック
if "みかん" in fruits:
print("みかんがあります")
並び替え
# 数値の並び替え
numbers = [5, 2, 8, 1, 9]
numbers.sort() # 昇順(小さい順)
print(numbers) # [1, 2, 5, 8, 9]
numbers.sort(reverse=True) # 降順(大きい順)
print(numbers) # [9, 8, 5, 2, 1]
# 文字列の並び替え
fruits = ["みかん", "りんご", "バナナ"]
fruits.sort()
print(fruits) # ['バナナ', 'みかん', 'りんご'] (あいうえお順)
順序の変更
fruits = ["りんご", "バナナ", "みかん"]
# 順序を逆にする
fruits.reverse()
print(fruits) # ['みかん', 'バナナ', 'りんご']
リストのコピー
original = ["りんご", "バナナ", "みかん"]
# 正しいコピーの作り方
copy1 = original.copy()
copy2 = original[:]
copy3 = list(original)
# 間違ったコピー(参照の共有)
wrong_copy = original
wrong_copy.append("いちご")
print(original) # ['りんご', 'バナナ', 'みかん', 'いちご'] (元も変更される!)
sort()、reverse()、count()、index()などのメソッドで、リストを効率的に操作できます。
リストの応用テクニック

for文との組み合わせ
基本的なループ:
fruits = ["りんご", "バナナ", "みかん"]
for fruit in fruits:
print(f"好きな果物: {fruit}")
インデックス付きのループ:
fruits = ["りんご", "バナナ", "みかん"]
for i, fruit in enumerate(fruits):
print(f"{i+1}番目の果物: {fruit}")
# 1番目の果物: りんご
# 2番目の果物: バナナ
# 3番目の果物: みかん
リスト内包表記
複雑な処理を1行で書けるテクニックです:
基本的な内包表記:
# 1から5までの2乗を求める
squares = [x**2 for x in range(1, 6)]
print(squares) # [1, 4, 9, 16, 25]
# 偶数だけを抽出
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers) # [2, 4, 6, 8, 10]
実用的な例:
# 商品名を大文字に変換
products = ["apple", "banana", "orange"]
upper_products = [product.upper() for product in products]
print(upper_products) # ['APPLE', 'BANANA', 'ORANGE']
# 文字数が5文字以上の単語を抽出
words = ["cat", "elephant", "dog", "hippopotamus"]
long_words = [word for word in words if len(word) >= 5]
print(long_words) # ['elephant', 'hippopotamus']
2次元リスト
リストの中にリストを入れることで、表のようなデータを扱えます:
# 成績表(生徒名、国語、数学、英語)
grades = [
["太郎", 85, 92, 78],
["花子", 92, 88, 95],
["次郎", 78, 85, 82]
]
# 特定の生徒の成績を表示
print(f"{grades[0][0]}の成績:")
print(f"国語: {grades[0][1]}点")
print(f"数学: {grades[0][2]}点")
print(f"英語: {grades[0][3]}点")
# 全生徒の数学の成績を取得
math_scores = [student[2] for student in grades]
print(f"数学の成績: {math_scores}") # [92, 88, 85]
リストと関数の組み合わせ
def analyze_scores(scores):
"""成績リストを分析する関数"""
if not scores:
return "データがありません"
total = sum(scores)
average = total / len(scores)
highest = max(scores)
lowest = min(scores)
return {
"平均点": round(average, 1),
"最高点": highest,
"最低点": lowest,
"合計点": total,
"人数": len(scores)
}
# 使用例
test_scores = [85, 92, 78, 96, 88, 74, 91]
result = analyze_scores(test_scores)
for key, value in result.items():
print(f"{key}: {value}")
for文、内包表記、2次元リスト、関数との組み合わせで、複雑なデータ処理も効率的に行えます。
よくあるエラーと対策

エラー1:IndexError(存在しないインデックス)
エラーが起きる例:
fruits = ["りんご", "バナナ", "みかん"]
print(fruits[5]) # IndexError: list index out of range
対策:
fruits = ["りんご", "バナナ", "みかん"]
# 事前にリストの長さをチェック
if len(fruits) > 5:
print(fruits[5])
else:
print("インデックス5は存在しません")
# またはtry-except文を使用
try:
print(fruits[5])
except IndexError:
print("指定されたインデックスは存在しません")
エラー2:ValueError(存在しない値を削除)
エラーが起きる例:
fruits = ["りんご", "バナナ", "みかん"]
fruits.remove("いちご") # ValueError: list.remove(x): x not in list
対策:
fruits = ["りんご", "バナナ", "みかん"]
# 事前に存在をチェック
if "いちご" in fruits:
fruits.remove("いちご")
else:
print("いちごはリストにありません")
# またはtry-except文を使用
try:
fruits.remove("いちご")
except ValueError:
print("指定された値はリストにありません")
エラー3:リストの参照共有
問題のある例:
original = [1, 2, 3]
copy = original # これは参照をコピーしただけ
copy.append(4)
print(original) # [1, 2, 3, 4] (元のリストも変更されてしまう)
正しいコピー:
original = [1, 2, 3]
copy = original.copy() # または original[:] や list(original)
copy.append(4)
print(original) # [1, 2, 3] (元のリストは変更されない)
print(copy) # [1, 2, 3, 4]
エラー4:文字列とリストの混同
間違った例:
text = "hello"
text.append("world") # AttributeError: 'str' object has no attribute 'append'
正しい方法:
# 文字列の場合
text = "hello"
text = text + " world" # 文字列の結合
print(text) # "hello world"
# リストの場合
words = ["hello"]
words.append("world")
print(words) # ['hello', 'world']
デバッグのコツ
リストで問題が起きたときは、以下をチェックしてください:
- インデックスの範囲: 0 ≤ インデックス < len(リスト)
- 要素の存在確認:
in
演算子で事前チェック - データ型の確認: リストか文字列か
- 参照とコピーの区別: 意図しない変更を避ける
エラーの多くは「範囲外アクセス」「存在しない値の操作」「参照の共有」が原因です。
実践的なリスト活用例

例1:成績管理システム
def grade_manager():
"""成績管理システム"""
students = []
while True:
print("\n=== 成績管理システム ===")
print("1. 生徒追加")
print("2. 成績表示")
print("3. 平均点計算")
print("4. 終了")
choice = input("選択してください (1-4): ")
if choice == "1":
name = input("生徒名: ")
score = int(input("点数: "))
students.append({"name": name, "score": score})
print(f"{name}さんを追加しました")
elif choice == "2":
if students:
print("\n=== 成績一覧 ===")
for i, student in enumerate(students, 1):
print(f"{i}. {student['name']}: {student['score']}点")
else:
print("データがありません")
elif choice == "3":
if students:
total = sum(student["score"] for student in students)
average = total / len(students)
print(f"平均点: {average:.1f}点")
else:
print("データがありません")
elif choice == "4":
print("終了します")
break
# grade_manager() # 実行したい場合はコメントアウトを外す
例2:買い物リスト管理
def shopping_list_manager():
"""買い物リスト管理"""
shopping_list = []
def show_list():
if shopping_list:
print("\n=== 買い物リスト ===")
for i, item in enumerate(shopping_list, 1):
print(f"{i}. {item}")
else:
print("リストは空です")
def add_item():
item = input("追加する商品: ")
if item not in shopping_list:
shopping_list.append(item)
print(f"'{item}'を追加しました")
else:
print(f"'{item}'はすでにリストにあります")
def remove_item():
show_list()
if shopping_list:
try:
index = int(input("削除する番号: ")) - 1
removed = shopping_list.pop(index)
print(f"'{removed}'を削除しました")
except (IndexError, ValueError):
print("無効な番号です")
while True:
print("\n=== 買い物リスト管理 ===")
print("1. リスト表示")
print("2. 商品追加")
print("3. 商品削除")
print("4. 終了")
choice = input("選択してください (1-4): ")
if choice == "1":
show_list()
elif choice == "2":
add_item()
elif choice == "3":
remove_item()
elif choice == "4":
print("終了します")
break
# shopping_list_manager() # 実行したい場合はコメントアウトを外す
例3:データ分析
def analyze_temperature_data():
"""気温データの分析"""
# 1週間の気温データ
temperatures = [22.5, 25.3, 21.8, 26.1, 24.7, 23.9, 22.1]
days = ["月", "火", "水", "木", "金", "土", "日"]
# 基本統計
avg_temp = sum(temperatures) / len(temperatures)
max_temp = max(temperatures)
min_temp = min(temperatures)
print("=== 1週間の気温分析 ===")
# 日別気温表示
for day, temp in zip(days, temperatures):
print(f"{day}曜日: {temp}°C")
print(f"\n平均気温: {avg_temp:.1f}°C")
print(f"最高気温: {max_temp}°C")
print(f"最低気温: {min_temp}°C")
# 平均より高い日を抽出
hot_days = [(day, temp) for day, temp in zip(days, temperatures)
if temp > avg_temp]
print(f"\n平均より暑い日:")
for day, temp in hot_days:
print(f" {day}曜日: {temp}°C")
analyze_temperature_data()
まとめ
Pythonのリストは、複数のデータを効率的に管理し、様々な処理を行うための基本的で強力なツールです。
基本概念:
[]
でリストを作成し、インデックスでアクセス- 順序があり、変更可能で、異なる型を混在できる
基本操作:
- append()、insert()、extend()で要素追加
- remove()、del、pop()、clear()で要素削除
- sort()、reverse()、count()、index()で便利な操作
応用テクニック:
- for文、内包表記、2次元リストで高度な処理
- 関数との組み合わせでより実用的なプログラム
コメント