【初心者向け】Pythonのリスト完全ガイド|基本操作から応用テクニックまで

プログラミングをしていると、こんな場面に出会うことがあります:

  • 「クラス全員の成績を管理したい」
  • 「お気に入りの映画リストを作りたい」
  • 「毎日の気温データを記録したい」
  • 「複数のユーザー名を一度に処理したい」

こんなとき、変数を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']

デバッグのコツ

リストで問題が起きたときは、以下をチェックしてください:

  1. インデックスの範囲: 0 ≤ インデックス < len(リスト)
  2. 要素の存在確認: in演算子で事前チェック
  3. データ型の確認: リストか文字列か
  4. 参照とコピーの区別: 意図しない変更を避ける

エラーの多くは「範囲外アクセス」「存在しない値の操作」「参照の共有」が原因です。


実践的なリスト活用例

例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次元リストで高度な処理
  • 関数との組み合わせでより実用的なプログラム

コメント

タイトルとURLをコピーしました