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

リストの要素にアクセスする

目次

1. このレッスンで学ぶこと

  • インデックスを使った要素へのアクセス
  • 負のインデックス
  • 要素の変更方法
  • インデックスエラーの回避

2. インデックスとは

インデックスは、リストの各要素の位置を示す番号です。リスト内の要素にアクセスするための「アドレス」として機能します。

項目説明
開始番号0(1ではない)
表記法リスト[インデックス]
負のインデックス-1は最後の要素
範囲外IndexErrorが発生

主な特徴:

  • リストの各要素には一意のインデックスが割り当てられている
  • インデックスは0から始まるため、n番目の要素は[n-1]でアクセス
  • 負のインデックスを使うと後ろからカウントできる
  • インデックスを使って要素を変更することも可能

簡単なコード例:

Python
fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]

# インデックスでアクセス
print(fruits[0])   # 最初の要素
print(fruits[2])   # 3番目の要素
print(fruits[-1])  # 最後の要素

# 要素の変更
fruits[1] = "メロン"
print(fruits)

実行結果:

りんご
オレンジ
ぶどう
['りんご', 'メロン', 'オレンジ', 'ぶどう']

3. なぜインデックスが必要なのか?

リストの特定の位置にある要素を取得したり、変更したりするには、インデックスを使います。

Python
fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]

# 最初の果物を取得
first = fruits[0]
print(first)  # りんご

# 2番目の果物を取得
second = fruits[1]
print(second)  # バナナ

インデックスを使うことで、リストの任意の位置の要素にアクセスできます。

💡 豆知識: プログラミングの世界では、数え始めを0からにする慣習があります。これは配列のメモリアドレス計算を効率的にするための歴史的な理由から来ています。


4. インデックスの基本

機能: リストの各要素の位置を示す番号です。

書き方:

Python
リスト[インデックス]

用途: 特定位置の要素取得、要素の変更、条件による要素選択

注意点:

  • インデックスは0から始まる
  • 範囲外のインデックスはエラー
  • 負のインデックスは後ろから数える
Python
fruits = ["りんご", "バナナ", "オレンジ"]

# インデックスは0から始まる
print(fruits[0])  # 最初の要素
print(fruits[1])  # 2番目の要素
print(fruits[2])  # 3番目の要素

実行結果:

りんご
バナナ
オレンジ

5. 正のインデックス

基本的なアクセス

Python
# インデックスの仕組み
#   0       1        2         3
# ["りんご", "バナナ", "オレンジ", "ぶどう"]

fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]

print(f"0番目: {fruits[0]}")
print(f"1番目: {fruits[1]}")
print(f"2番目: {fruits[2]}")
print(f"3番目: {fruits[3]}")

実行結果:

0番目: りんご
1番目: バナナ
2番目: オレンジ
3番目: ぶどう

最初と最後の要素

機能: リストの最初または最後の要素にアクセスします。

書き方:

Python
最初 = リスト[0]
最後 = リスト[len(リスト) - 1]
または
最後 = リスト[-1]

用途: データの先頭・末尾の取得、境界値の確認

注意点: 空のリストではエラーになる

Python
numbers = [10, 20, 30, 40, 50]

# 最初の要素
first = numbers[0]
print(f"最初: {first}")

# 最後の要素(2つの方法)
last1 = numbers[len(numbers) - 1]
last2 = numbers[-1]
print(f"最後: {last1}")
print(f"最後: {last2}")

実行結果:

最初: 10
最後: 50
最後: 50

6. 負のインデックス

後ろから数える

機能: リストの末尾から要素にアクセスします。

書き方:

Python
リスト[-1]  # 最後の要素
リスト[-2]  # 最後から2番目
リスト[-3]  # 最後から3番目

用途: 末尾からのアクセス、最後のn個の取得

注意点: -1が最後の要素(-0は存在しない)

Python
# 負のインデックスの仕組み
#   -4      -3       -2        -1
# ["りんご", "バナナ", "オレンジ", "ぶどう"]

fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]

print(f"最後: {fruits[-1]}")
print(f"最後から2番目: {fruits[-2]}")
print(f"最後から3番目: {fruits[-3]}")
print(f"最後から4番目: {fruits[-4]}")

実行結果:

最後: ぶどう
最後から2番目: オレンジ
最後から3番目: バナナ
最後から4番目: りんご

正と負のインデックスの対応

Python
numbers = [10, 20, 30, 40, 50]

# 同じ要素にアクセス
print(f"numbers[0] = {numbers[0]}")
print(f"numbers[-5] = {numbers[-5]}")
print()

print(f"numbers[4] = {numbers[4]}")
print(f"numbers[-1] = {numbers[-1]}")

実行結果:

numbers[0] = 10
numbers[-5] = 10

numbers[4] = 50
numbers[-1] = 50

7. 要素の変更

要素の更新

機能: リストの特定位置の要素を新しい値に変更します。

書き方:

Python
リスト[インデックス] = 新しい値

用途: データの更新、値の修正、状態の変更

注意点: 元のリストが変更される(破壊的操作)

Python
fruits = ["りんご", "バナナ", "オレンジ"]
print(f"変更前: {fruits}")

# 2番目の要素を変更
fruits[1] = "メロン"
print(f"変更後: {fruits}")

# 最後の要素を変更
fruits[-1] = "ぶどう"
print(f"さらに変更: {fruits}")

実行結果:

変更前: ['りんご', 'バナナ', 'オレンジ']
変更後: ['りんご', 'メロン', 'オレンジ']
さらに変更: ['りんご', 'メロン', 'ぶどう']

複数の要素を変更

Python
scores = [70, 80, 90, 60, 75]
print(f"変更前: {scores}")

# 最初の3つを変更
scores[0] = 85
scores[1] = 92
scores[2] = 88
print(f"変更後: {scores}")

実行結果:

変更前: [70, 80, 90, 60, 75]
変更後: [85, 92, 88, 60, 75]

8. 具体例

例1: 成績の修正

Python
# テストの点数
scores = [85, 72, 90, 68, 95]

print("=== 成績修正 ===")
print(f"修正前: {scores}")

# 2番目の点数を修正
scores[1] = 75
print(f"修正後: {scores}")

# 平均を計算
average = sum(scores) / len(scores)
print(f"平均: {average:.1f}点")

実行結果:

=== 成績修正 ===
修正前: [85, 72, 90, 68, 95]
修正後: [85, 75, 90, 68, 95]
平均: 82.6点

例2: 在庫管理

Python
# 商品の在庫数
stock = [10, 5, 20, 8, 15]
products = ["商品A", "商品B", "商品C", "商品D", "商品E"]

print("=== 在庫状況 ===")
for i in range(len(products)):
    print(f"{products[i]}: {stock[i]}個")

# 商品Bを3個販売
stock[1] = stock[1] - 3
print(f"\n商品B販売後: {stock[1]}個")

実行結果:

=== 在庫状況 ===
商品A: 10個
商品B: 5個
商品C: 20個
商品D: 8個
商品E: 15個

商品B販売後: 2個

例3: タスクの完了マーク

Python
tasks = ["メール確認", "資料作成", "会議準備", "報告書作成"]
status = ["未完了", "未完了", "未完了", "未完了"]

print("=== タスク管理 ===")
for i in range(len(tasks)):
    print(f"{i + 1}. {tasks[i]}: {status[i]}")

# 最初のタスクを完了
status[0] = "完了"

# 3番目のタスクを完了
status[2] = "完了"

print("\n=== 更新後 ===")
for i in range(len(tasks)):
    print(f"{i + 1}. {tasks[i]}: {status[i]}")

実行結果:

=== タスク管理 ===
1. メール確認: 未完了
2. 資料作成: 未完了
3. 会議準備: 未完了
4. 報告書作成: 未完了

=== 更新後 ===
1. メール確認: 完了
2. 資料作成: 未完了
3. 会議準備: 完了
4. 報告書作成: 未完了

9. インデックスエラー

範囲外アクセス

Python
fruits = ["りんご", "バナナ", "オレンジ"]

# エラーになる例
try:
    print(fruits[3])  # インデックス3は存在しない
except IndexError as e:
    print(f"エラー: {e}")

# 正しい範囲
print(f"正しい範囲: 0 から {len(fruits) - 1}")

実行結果:

エラー: list index out of range
正しい範囲: 0 から 2

安全なアクセス

機能: インデックスエラーを回避して安全に要素にアクセスします。

書き方:

Python
if 0 <= インデックス < len(リスト):
= リスト[インデックス]

用途: ユーザー入力の処理、動的なインデックス、エラー回避

注意点: 負のインデックスも考慮する場合は条件を追加

Python
fruits = ["りんご", "バナナ", "オレンジ"]
index = 5

# 安全なアクセス
if 0 <= index < len(fruits):
    print(fruits[index])
else:
    print(f"インデックス{index}は範囲外です")

実行結果:

インデックス5は範囲外です

10. 練習問題

問題1(基礎)⭐☆☆

リスト ["赤", "青", "黄", "緑"] の最初と最後の要素を表示してください。

💡 ヒント

最初は[0]、最後は[-1]です。

✅ 解答例
Python
colors = ["赤", "青", "黄", "緑"]

print(f"最初: {colors[0]}")
print(f"最後: {colors[-1]}")

実行結果:

最初: 赤
最後: 緑

解説: インデックス0で最初、-1で最後の要素にアクセスできます。


問題2(基礎)⭐☆☆

リスト [10, 20, 30, 40, 50] の3番目の要素を100に変更してください。

💡 ヒント

3番目はインデックス2です。

✅ 解答例
Python
numbers = [10, 20, 30, 40, 50]
print(f"変更前: {numbers}")

numbers[2] = 100
print(f"変更後: {numbers}")

実行結果:

変更前: [10, 20, 30, 40, 50]
変更後: [10, 20, 100, 40, 50]

解説: インデックス2(3番目)の要素を100に変更しています。


問題3(応用)⭐⭐☆

リスト [1, 2, 3, 4, 5] の最初と最後の要素を入れ替えてください。

💡 ヒント

一時変数を使うか、Pythonの同時代入を使います。

✅ 解答例
Python
numbers = [1, 2, 3, 4, 5]
print(f"変更前: {numbers}")

# 同時代入で入れ替え
numbers[0], numbers[-1] = numbers[-1], numbers[0]
print(f"変更後: {numbers}")

実行結果:

変更前: [1, 2, 3, 4, 5]
変更後: [5, 2, 3, 4, 1]

解説: Pythonの同時代入機能で、最初と最後の要素を入れ替えています。


11. まとめ

このレッスンでは、インデックスを使ったリスト要素アクセスを学びました。

  • インデックスは0から始まり、位置を指定して要素を取得できます。
  • 負のインデックスを使うと末尾側から要素を参照できます。
  • インデックス指定で要素の更新ができることを確認しました。
  • 範囲外アクセスで IndexError が発生する点を理解しました。
  • 長さ確認や条件分岐を使って、安全にアクセスすることが重要です。