ステップ7:リスト(配列)の基礎

📋 ステップ7: リスト(配列)の基礎

複数のデータをまとめて扱おう

プログラミングでは、複数のデータをまとめて管理することがよくあります。このステップでは、Pythonで最もよく使うデータ構造「リスト」について学びます。

📖 このステップで学ぶこと

・リストとは何か、なぜ使うのか

・リストの作り方と要素へのアクセス方法

・要素の追加・削除・変更の方法

・リストのスライス(一部を切り出す)

・よく使うリストのメソッド

・実践的なリストの活用例

📝 1. リストとは何か?

まず、リストとは何か、なぜ必要なのかを理解しましょう。

🔰 リストを使わない場合の問題

例えば、5人の学生のテストの点数を管理したいとします。リストを使わない場合、こうなります:

コード:変数を5つ作る(非効率)

# 5人分の点数を別々の変数で管理
score1 = 85
score2 = 92
score3 = 78
score4 = 88
score5 = 95

# 合計を計算するのも大変…
total = score1 + score2 + score3 + score4 + score5
print(f"合計: {total}点")

⚠️ この方法の問題点

・変数が増えると管理が大変(100人分だと変数100個!)

・「全員の平均を出す」などの処理が面倒

・後から人数が増えるとコードの修正が必要

🔰 リストを使うとスッキリ!

リストを使うと、複数のデータを1つの変数にまとめて管理できます。

コード:リストを使う(効率的)

# 5人分の点数を1つのリストで管理
scores = [85, 92, 78, 88, 95]

# 合計も簡単に計算できる
total = sum(scores)
print(f"合計: {total}点")

実行結果

合計: 438点

💡 リストのイメージ

リストは「番号付きの箱」のようなものです。

1つの箱の中に、複数のデータを順番に並べて入れておけます。

各データには「番号(インデックス)」が付いていて、番号を指定して取り出せます。

📘 リストの基本的な特徴

特徴 説明
角カッコ [ ] で囲む リストは [ ] で作ります
カンマ , で区切る 要素はカンマで区切ります
順番がある データは入れた順番で保存されます
変更できる 後から要素の追加・削除・変更ができます
異なる型も入れられる 文字列、数値、真偽値を混在できます

📝 リストの作り方

いくつかの方法でリストを作ることができます。

コード:様々なリストの作り方

# 文字列のリスト
fruits = ["りんご", "バナナ", "オレンジ"]
print(fruits)

# 数値のリスト
numbers = [1, 2, 3, 4, 5]
print(numbers)

# 空のリスト(後から要素を追加する場合に使う)
empty_list = []
print(empty_list)

# 異なる型を混在させたリスト
mixed = ["太郎", 25, 175.5, True]
print(mixed)

実行結果

['りんご', 'バナナ', 'オレンジ']
[1, 2, 3, 4, 5]
[]
['太郎', 25, 175.5, True]

💡 コードの解説

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

 → 文字列を3つ入れたリストを作り、変数fruitsに代入

empty_list = []

 → 空のリストを作成。後からappend()で要素を追加できます

mixed = ["太郎", 25, 175.5, True]

 → 文字列、整数、小数、真偽値を混在させることも可能

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

リストに入れたデータを取り出すには「インデックス(番号)」を使います。

🔰 インデックスとは?

リストの各要素には、自動的に番号が付けられます。この番号をインデックスと呼びます。

⚠️ 超重要:インデックスは0から始まる!

プログラミングでは、番号は1からではなく0から始まります

これは最初は戸惑いますが、慣れれば自然になります。

📌 インデックスの仕組み

リスト: [“りんご”, “バナナ”, “オレンジ”, “ぶどう”, “メロン”]

要素 りんご バナナ オレンジ ぶどう メロン
正のインデックス 0 1 2 3 4
負のインデックス -5 -4 -3 -2 -1

📝 インデックスで要素を取得する

リスト[インデックス]と書くと、指定した位置の要素を取得できます。

コード:正のインデックスで取得

# リストを作成
fruits = ["りんご", "バナナ", "オレンジ", "ぶどう", "メロン"]

# インデックス0(最初の要素)を取得
print(fruits[0])

# インデックス1(2番目の要素)を取得
print(fruits[1])

# インデックス4(5番目の要素)を取得
print(fruits[4])

実行結果

りんご
バナナ
メロン

📝 負のインデックスで後ろから取得

負の数を使うと、後ろから数えて要素を取得できます。

コード:負のインデックスで取得

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

# インデックス-1(最後の要素)を取得
print(fruits[-1])

# インデックス-2(後ろから2番目)を取得
print(fruits[-2])

# インデックス-5(後ろから5番目=最初)を取得
print(fruits[-5])

実行結果

メロン
ぶどう
りんご

💡 負のインデックスの便利さ

「最後の要素」を取得したいとき、リストの長さを知らなくても [-1] で取得できます。

これはとても便利で、実務でもよく使います。

📝 リストの長さを取得する – len()関数

len()関数を使うと、リストの要素数(長さ)を取得できます。

コード:リストの長さを取得

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

# len()でリストの要素数を取得
length = len(fruits)
print(f"要素数: {length}")

# 最後の要素にアクセスする方法(2つ)
# 方法1: 負のインデックス(おすすめ)
print(fruits[-1])

# 方法2: len() - 1 を使う
print(fruits[len(fruits) - 1])

実行結果

要素数: 3
オレンジ
オレンジ

💡 コードの解説

len(fruits) → リストの要素数(3)を返す

fruits[-1] → 最後の要素を直接取得(シンプルでおすすめ)

fruits[len(fruits) - 1] → len()は3を返すので、fruits[3-1]=fruits[2]となり最後の要素を取得

⚠️ インデックスの範囲外エラー

存在しないインデックスを指定すると、エラーになります。

❌ エラーになる例

fruits = ["りんご", "バナナ", "オレンジ"]  # 要素数は3

# インデックス3は存在しない(0, 1, 2 しかない)
# print(fruits[3])  # IndexError: list index out of range

# インデックス-4も存在しない
# print(fruits[-4])  # IndexError: list index out of range

このエラーを防ぐには、アクセス前に len() で長さを確認するか、[-1] のような安全な方法を使いましょう。

➕ 3. リストへの要素の追加

リストは作成後に要素を追加できます。追加方法は3つあります。

📘 追加方法の比較

メソッド 機能 使用例
append() 末尾に1つ追加 list.append(“新しい要素”)
insert() 指定位置に挿入 list.insert(1, “要素”)
extend() 複数の要素をまとめて追加 list.extend([1, 2, 3])

📝 append() – 末尾に1つ追加する

append()は最もよく使う追加方法です。リストの最後に要素を1つ追加します。

💡 append()とは?

「append」は「追加する、付け加える」という意味の英語です。

リストの末尾に新しい要素を1つ追加します。

コード:append()で追加

# 最初は2つの要素を持つリスト
fruits = ["りんご", "バナナ"]
print(f"最初: {fruits}")

# append()で末尾に追加
# fruits.append("オレンジ") は「fruitsの末尾にオレンジを追加する」という意味
fruits.append("オレンジ")
print(f"追加後: {fruits}")

# さらに追加
fruits.append("ぶどう")
print(f"追加後: {fruits}")

実行結果

最初: ['りんご', 'バナナ']
追加後: ['りんご', 'バナナ', 'オレンジ']
追加後: ['りんご', 'バナナ', 'オレンジ', 'ぶどう']

📝 insert() – 指定位置に挿入する

insert(位置, 値)を使うと、好きな位置に要素を挿入できます。

💡 insert()の書き方

リスト.insert(挿入位置のインデックス, 挿入する値)

指定した位置に要素が入り、それ以降の要素は後ろにずれます。

コード:insert()で挿入

fruits = ["りんご", "バナナ", "オレンジ"]
print(f"最初: {fruits}")

# インデックス1の位置(バナナの前)に「いちご」を挿入
# insert(1, "いちご") は「位置1にいちごを入れる」という意味
fruits.insert(1, "いちご")
print(f"挿入後: {fruits}")

# インデックス0(先頭)に「メロン」を挿入
fruits.insert(0, "メロン")
print(f"先頭挿入: {fruits}")

実行結果

最初: ['りんご', 'バナナ', 'オレンジ']
挿入後: ['りんご', 'いちご', 'バナナ', 'オレンジ']
先頭挿入: ['メロン', 'りんご', 'いちご', 'バナナ', 'オレンジ']

📝 extend() – 複数の要素をまとめて追加

extend()は、別のリストの要素をまとめて追加します。

💡 extend()とは?

「extend」は「拡張する」という意味の英語です。

リストを拡張して、別のリストの要素を全て追加します。

コード:extend()で複数追加

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

# extend()で複数の要素を一度に追加
# new_fruitsの中身が全てfruitsに追加される
fruits.extend(new_fruits)
print(fruits)

実行結果

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

⚠️ append()とextend()の違い(重要!)

この2つは混同しやすいので、違いをしっかり理解しましょう。

コード:append()とextend()の違い

# append()の場合
list1 = [1, 2, 3]
list1.append([4, 5])  # リスト[4, 5]を「1つの要素」として追加
print(f"append: {list1}")

# extend()の場合
list2 = [1, 2, 3]
list2.extend([4, 5])  # リスト[4, 5]の「中身」を個別に追加
print(f"extend: {list2}")

実行結果

append: [1, 2, 3, [4, 5]]
extend: [1, 2, 3, 4, 5]

📌 違いのまとめ

メソッド 動作 結果
append([4, 5]) [4, 5]を1つの要素として追加 [1, 2, 3, [4, 5]]
extend([4, 5]) 4と5を個別に追加 [1, 2, 3, 4, 5]

📝 + 演算子でリストを結合

+演算子を使ってリストを結合することもできます。

コード:+演算子でリスト結合

list1 = [1, 2, 3]
list2 = [4, 5, 6]

# +で結合(新しいリストを作成)
combined = list1 + list2
print(f"結合: {combined}")

# 元のリストは変わらない
print(f"list1: {list1}")
print(f"list2: {list2}")

実行結果

結合: [1, 2, 3, 4, 5, 6]
list1: [1, 2, 3]
list2: [4, 5, 6]

💡 extend()と+の違い

extend() → 元のリストを直接変更する

+ → 新しいリストを作成する(元のリストは変わらない)

🗑️ 4. リストからの要素の削除

リストから要素を削除する方法もいくつかあります。状況に応じて使い分けましょう。

📘 削除方法の比較

方法 機能 使用例
remove() 値を指定して削除 list.remove(“バナナ”)
pop() 位置を指定して削除(値を返す) list.pop(1)
del文 位置を指定して削除 del list[1]
clear() 全要素を削除 list.clear()

📝 remove() – 値を指定して削除

remove()は、削除したいを指定します。最初に見つかった1つだけを削除します。

💡 remove()の特徴

・削除したい「値」を指定する(インデックスではない)

・同じ値が複数あっても、最初の1つだけを削除

・値が見つからないとエラーになる

コード:remove()で削除

# 「バナナ」が2つあるリスト
fruits = ["りんご", "バナナ", "オレンジ", "バナナ"]
print(f"最初: {fruits}")

# remove("バナナ") で「バナナ」を削除
# 最初に見つかった1つだけが削除される
fruits.remove("バナナ")
print(f"削除後: {fruits}")

実行結果

最初: ['りんご', 'バナナ', 'オレンジ', 'バナナ']
削除後: ['りんご', 'オレンジ', 'バナナ']

※最初の「バナナ」(インデックス1)だけが削除され、2番目の「バナナ」は残っています。

📝 pop() – 位置を指定して削除(値も取得)

pop()は、インデックスを指定して削除します。削除した値を返すのが特徴です。

💡 pop()の特徴

・削除したい「位置(インデックス)」を指定する

・削除した値を返す(変数に保存できる)

・引数なしで呼び出すと、最後の要素を削除

コード:pop()で削除

fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]
print(f"最初: {fruits}")

# pop() - 引数なしで最後の要素を削除
# 削除した値を変数lastに保存
last = fruits.pop()
print(f"削除した要素: {last}")
print(f"削除後: {fruits}")

# pop(1) - インデックス1の要素を削除
second = fruits.pop(1)
print(f"削除した要素: {second}")
print(f"削除後: {fruits}")

実行結果

最初: ['りんご', 'バナナ', 'オレンジ', 'ぶどう']
削除した要素: ぶどう
削除後: ['りんご', 'バナナ', 'オレンジ']
削除した要素: バナナ
削除後: ['りんご', 'オレンジ']

💡 pop()はいつ使う?

削除した値を使いたい場合に便利です。例えば:

・「カートから商品を削除して、その商品名を表示する」

・「待ち行列から次の人を取り出して処理する」

📝 del文 – 位置を指定して削除

del文でも、インデックスを指定して要素を削除できます。

コード:del文で削除

fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]
print(f"最初: {fruits}")

# del でインデックス2の要素を削除
del fruits[2]
print(f"削除後: {fruits}")

実行結果

最初: ['りんご', 'バナナ', 'オレンジ', 'ぶどう']
削除後: ['りんご', 'バナナ', 'ぶどう']

📌 pop()とdelの違い

方法 削除した値 使いどころ
pop() 返す(取得できる) 削除した値を使いたい時
del 返さない 単に削除したい時

📝 clear() – 全ての要素を削除

clear()は、リストの全要素を削除して空にします。

コード:clear()で全削除

fruits = ["りんご", "バナナ", "オレンジ"]
print(f"最初: {fruits}")

# clear()で全要素を削除
fruits.clear()
print(f"削除後: {fruits}")

実行結果

最初: ['りんご', 'バナナ', 'オレンジ']
削除後: []

✏️ 5. リストの要素の変更

リストの要素は、インデックスを指定して直接変更できます。

📝 インデックスで値を変更

コード:要素の変更

fruits = ["りんご", "バナナ", "オレンジ"]
print(f"最初: {fruits}")

# インデックス1の要素を「いちご」に変更
# fruits[1] は「バナナ」を指している
# それを「いちご」で上書きする
fruits[1] = "いちご"
print(f"変更後: {fruits}")

# 負のインデックスでも変更できる
# fruits[-1] は最後の要素「オレンジ」
fruits[-1] = "メロン"
print(f"変更後: {fruits}")

実行結果

最初: ['りんご', 'バナナ', 'オレンジ']
変更後: ['りんご', 'いちご', 'オレンジ']
変更後: ['りんご', 'いちご', 'メロン']

💡 変更の仕組み

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

この書き方で、指定した位置の値を新しい値で上書きします。

✂️ 6. リストのスライス

文字列のステップで学んだ「スライス」は、リストでも使えます。リストの一部を切り出すことができます。

🔰 スライスの基本

💡 スライスの書き方

リスト[開始:終了] → 開始から終了の手前までを切り出す

リスト[開始:終了:ステップ] → ステップ間隔で切り出す

コード:基本的なスライス

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# [2:5] - インデックス2から5の手前まで
print(numbers[2:5])

# [:4] - 最初からインデックス4の手前まで
print(numbers[:4])

# [6:] - インデックス6から最後まで
print(numbers[6:])

# [:] - 全体をコピー
print(numbers[:])

実行結果

[2, 3, 4]
[0, 1, 2, 3]
[6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

📌 スライスの図解

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

スライス 意味 結果
[2:5] インデックス2, 3, 4を取得 [2, 3, 4]
[:4] 最初から4の手前まで(0, 1, 2, 3) [0, 1, 2, 3]
[6:] 6から最後まで(6, 7, 8, 9) [6, 7, 8, 9]
[:] 全体(コピーを作成) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

📝 ステップを使ったスライス

3つ目の数値(ステップ)を指定すると、間隔を空けて要素を取得できます。

コード:ステップ付きスライス

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# [::2] - 2個おきに取得(偶数インデックス)
print(numbers[::2])

# [1::2] - インデックス1から2個おきに(奇数インデックス)
print(numbers[1::2])

# [::-1] - 逆順に取得
print(numbers[::-1])

実行結果

[0, 2, 4, 6, 8]
[1, 3, 5, 7, 9]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

💡 [::-1]で逆順にする

[::-1]は、リストを逆順にするテクニックとしてよく使われます。

ステップが-1なので、後ろから前に向かって1つずつ取得します。

📝 スライスの実用例

コード:実用的なスライス

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

# 最初の3つを取得
print(f"最初の3つ: {fruits[:3]}")

# 最後の2つを取得
print(f"最後の2つ: {fruits[-2:]}")

# 2番目から4番目まで(インデックス1, 2, 3)
print(f"真ん中: {fruits[1:4]}")

# 1つおきに取得
print(f"1つおき: {fruits[::2]}")

実行結果

最初の3つ: ['りんご', 'バナナ', 'オレンジ']
最後の2つ: ['メロン', 'いちご']
真ん中: ['バナナ', 'オレンジ', 'ぶどう']
1つおき: ['りんご', 'オレンジ', 'メロン']

⚠️ スライスの重要なポイント

スライスは新しいリストを作成します。元のリストは変更されません。

これは、リストの一部だけを使いたい時に便利です。

🔧 7. よく使うリストのメソッド

リストには便利なメソッド(機能)がたくさんあります。よく使うものを覚えましょう。

📘 主要なメソッド一覧

メソッド 機能
in演算子 要素が含まれているか確認 “A” in list
index() 要素の位置を検索 list.index(“A”)
count() 要素の出現回数を数える list.count(“A”)
sort() リストを並び替え list.sort()
reverse() リストを逆順に list.reverse()
copy() リストをコピー list.copy()

📝 要素の検索 – in演算子

in演算子を使うと、要素がリストに含まれているかを確認できます。

コード:in演算子で検索

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

# 「バナナ」がリストに含まれているか?
# 結果は True または False
print("バナナ" in fruits)

# 「メロン」がリストに含まれているか?
print("メロン" in fruits)

# if文と組み合わせて使う
if "バナナ" in fruits:
    print("バナナはリストに含まれています")
else:
    print("バナナはリストに含まれていません")

実行結果

True
False
バナナはリストに含まれています

📝 要素の位置を検索 – index()

index()は、指定した値が最初に見つかる位置(インデックス)を返します。

コード:index()で位置を検索

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

# 「バナナ」が最初に現れる位置を検索
# index()は最初に見つかった位置だけを返す
position = fruits.index("バナナ")
print(f"バナナの位置: {position}")

実行結果

バナナの位置: 1

⚠️ 注意

存在しない値でindex()を使うとエラーになります。

事前にinで存在確認してから使うと安全です。

📝 要素の出現回数 – count()

count()は、指定した値がリストに何回現れるかを数えます。

コード:count()で出現回数を数える

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

# 「バナナ」が何回出現するか
count = fruits.count("バナナ")
print(f"バナナの数: {count}個")

# 存在しない値は0回
count2 = fruits.count("メロン")
print(f"メロンの数: {count2}個")

実行結果

バナナの数: 2個
メロンの数: 0個

📝 リストの並び替え – sort()

sort()は、リストの要素を順番に並び替えます。

💡 sort()の特徴

・元のリスト自体を変更する(新しいリストは作らない)

・デフォルトは昇順(小さい→大きい)

reverse=Trueを指定すると降順(大きい→小さい)

コード:sort()で並び替え

numbers = [3, 1, 4, 1, 5, 9, 2, 6]

# sort() - 昇順に並び替え(元のリストを変更)
numbers.sort()
print(f"昇順: {numbers}")

# sort(reverse=True) - 降順に並び替え
numbers.sort(reverse=True)
print(f"降順: {numbers}")

実行結果

昇順: [1, 1, 2, 3, 4, 5, 6, 9]
降順: [9, 6, 5, 4, 3, 2, 1, 1]

📝 sorted()関数 – 新しいリストを返す

元のリストを変えずに、並び替えた新しいリストを作りたい場合はsorted()関数を使います。

コード:sorted()で新しいリストを作成

numbers = [3, 1, 4, 1, 5]

# sorted() - 新しいリストを返す(元のリストは変わらない)
sorted_numbers = sorted(numbers)

print(f"元のリスト: {numbers}")
print(f"ソート済み: {sorted_numbers}")

実行結果

元のリスト: [3, 1, 4, 1, 5]
ソート済み: [1, 1, 3, 4, 5]

📌 sort()とsorted()の違い

方法 元のリスト 戻り値
list.sort() 変更される なし(None)
sorted(list) 変更されない 新しいリスト

📝 リストの反転 – reverse()

reverse()は、リストの順番を逆にします。

コード:reverse()で反転

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

# reverse() - 元のリストを反転
fruits.reverse()
print(f"反転後: {fruits}")

# スライスでも反転できる(新しいリストを作成)
letters = ["A", "B", "C", "D", "E"]
reversed_letters = letters[::-1]
print(f"元のリスト: {letters}")
print(f"反転コピー: {reversed_letters}")

実行結果

反転後: ['オレンジ', 'バナナ', 'りんご']
元のリスト: ['A', 'B', 'C', 'D', 'E']
反転コピー: ['E', 'D', 'C', 'B', 'A']

⚠️ 超重要:リストのコピー

リストをコピーする時は注意が必要です。間違った方法だと思わぬバグの原因になります。

❌ 間違ったコピー方法

# = で代入すると、同じリストを指す「参照」になる
list1 = [1, 2, 3]
list2 = list1  # これはコピーではない!

# list2を変更すると…
list2.append(4)

# list1も変わってしまう!
print(f"list1: {list1}")
print(f"list2: {list2}")

実行結果

list1: [1, 2, 3, 4]
list2: [1, 2, 3, 4]

list1も[1, 2, 3, 4]になってしまいました!

💡 なぜこうなる?

list2 = list1は、list1とlist2が「同じリスト」を指すようになります。

2つの変数が同じデータを共有しているので、片方を変更するともう片方も変わります。

✅ 正しいコピー方法

# 方法1: copy()メソッドを使う
list1 = [1, 2, 3]
list2 = list1.copy()  # 新しいリストを作成

list2.append(4)
print(f"list1: {list1}")  # list1は変わらない!
print(f"list2: {list2}")

# 方法2: スライス[:]を使う
list3 = [1, 2, 3]
list4 = list3[:]  # 全体のスライス = 新しいリスト

list4.append(4)
print(f"list3: {list3}")  # list3は変わらない!
print(f"list4: {list4}")

実行結果

list1: [1, 2, 3]
list2: [1, 2, 3, 4]
list3: [1, 2, 3]
list4: [1, 2, 3, 4]

🎯 8. リストの実践例

ここまで学んだことを使って、実用的なプログラムを作ってみましょう。

例1: 成績の管理と分析

コード:成績の分析

# 5科目のテストの点数
scores = [85, 92, 78, 88, 95]

# sum() - リストの合計を計算
total = sum(scores)
print(f"合計点: {total}点")

# len() - 要素数を取得して平均を計算
average = total / len(scores)
print(f"平均点: {average}点")

# max() - 最大値を取得
print(f"最高点: {max(scores)}点")

# min() - 最小値を取得
print(f"最低点: {min(scores)}点")

実行結果

合計点: 438点
平均点: 87.6点
最高点: 95点
最低点: 78点

💡 使用した組み込み関数

sum(list) → リストの要素の合計を返す

max(list) → リストの最大値を返す

min(list) → リストの最小値を返す

len(list) → リストの要素数を返す

例2: ショッピングリストの管理

コード:買い物リスト

# 空のリストから始める
shopping_list = []

# 商品を追加(append)
shopping_list.append("牛乳")
shopping_list.append("パン")
shopping_list.append("卵")
print(f"買い物リスト: {shopping_list}")

# リストに含まれているか確認(in)
if "パン" in shopping_list:
    print("パンはリストにあります")

# 商品を購入したら削除(remove)
shopping_list.remove("パン")
print(f"パン購入後: {shopping_list}")

# 残りの商品数(len)
print(f"残り: {len(shopping_list)}個")

実行結果

買い物リスト: ['牛乳', 'パン', '卵']
パンはリストにあります
パン購入後: ['牛乳', '卵']
残り: 2個

例3: 数値データの処理

コード:偶数だけを抽出

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 偶数だけを新しいリストに入れる
even_numbers = []

# forループで各要素をチェック
for num in numbers:
    # 2で割った余りが0なら偶数
    if num % 2 == 0:
        even_numbers.append(num)

print(f"元のリスト: {numbers}")
print(f"偶数だけ: {even_numbers}")

実行結果

元のリスト: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
偶数だけ: [2, 4, 6, 8, 10]

💡 コードの解説

1. 空のリストeven_numbersを用意

2. for num in numbers:でリストの各要素を順番に処理

3. if num % 2 == 0:で偶数かどうか判定

4. 偶数ならappend()で新しいリストに追加

例4: ランキングの作成

コード:点数でランキング

# 名前と点数のペアをリストで管理
students = [
    ["田中", 85],
    ["鈴木", 92],
    ["佐藤", 78],
    ["高橋", 95],
    ["伊藤", 88]
]

# 点数(各要素の[1]番目)で降順にソート
# key=lambda x: x[1] は「x[1](点数)を基準にする」という意味
students.sort(key=lambda x: x[1], reverse=True)

# ランキングを表示
print("【成績ランキング】")
for i, student in enumerate(students, 1):
    name = student[0]
    score = student[1]
    print(f"{i}位: {name}さん - {score}点")

実行結果

【成績ランキング】
1位: 高橋さん - 95点
2位: 鈴木さん - 92点
3位: 伊藤さん - 88点
4位: 田中さん - 85点
5位: 佐藤さん - 78点

💡 発展的な内容

この例では「リストの中にリストを入れる」という2次元リストを使っています。

lambdaenumerateは少し難しいので、今は「こういうこともできる」と知っておくだけでOKです。

📝 練習問題(15問)

ここまで学んだことを実際に手を動かして確認しましょう。

問題1:リストの作成(初級)

📋 問題

好きな果物を3つ以上含むリストを作成し、表示してください。

解答を見る

コード

# リストは [] で作り、要素は , で区切る
fruits = ["りんご", "バナナ", "いちご"]
print(fruits)

実行結果

['りんご', 'バナナ', 'いちご']

問題2:要素へのアクセス(初級)

📋 問題

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

解答を見る

コード

colors = ["赤", "青", "緑", "黄", "紫"]

# インデックス0が最初の要素
print(f"最初の要素: {colors[0]}")

# インデックス-1が最後の要素
print(f"最後の要素: {colors[-1]}")

実行結果

最初の要素: 赤
最後の要素: 紫

問題3:要素の追加(初級)

📋 問題

空のリストを作成し、append()を使って 1、2、3、4、5 を順番に追加してください。

解答を見る

コード

# 空のリストを作成
numbers = []
print(f"最初: {numbers}")

# append()で1つずつ末尾に追加
numbers.append(1)
numbers.append(2)
numbers.append(3)
numbers.append(4)
numbers.append(5)

print(f"追加後: {numbers}")

実行結果

最初: []
追加後: [1, 2, 3, 4, 5]

問題4:リストの長さ(初級)

📋 問題

リスト animals = ["犬", "猫", "鳥", "魚", "うさぎ"] の要素数を表示してください。

解答を見る

コード

animals = ["犬", "猫", "鳥", "魚", "うさぎ"]

# len()でリストの要素数を取得
count = len(animals)
print(f"要素数: {count}")

実行結果

要素数: 5

問題5:要素の削除(初級)

📋 問題

リスト numbers = [10, 20, 30, 40, 50] から、remove()を使って30を削除してください。

解答を見る

コード

numbers = [10, 20, 30, 40, 50]
print(f"最初: {numbers}")

# remove()で値「30」を削除
numbers.remove(30)
print(f"削除後: {numbers}")

実行結果

最初: [10, 20, 30, 40, 50]
削除後: [10, 20, 40, 50]

問題6:要素の変更(中級)

📋 問題

リスト fruits = ["りんご", "バナナ", "オレンジ"] の2番目の要素(バナナ)を「いちご」に変更してください。

解答を見る

コード

fruits = ["りんご", "バナナ", "オレンジ"]
print(f"最初: {fruits}")

# インデックス1(2番目)の値を変更
fruits[1] = "いちご"
print(f"変更後: {fruits}")

実行結果

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

問題7:スライスの練習(中級)

📋 問題

リスト numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] から、3番目から7番目の手前までを取り出してください。

解答を見る

コード

numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# [3:7] でインデックス3から7の手前まで
result = numbers[3:7]
print(result)

実行結果

[3, 4, 5, 6]

問題8:リストの反転(中級)

📋 問題

リスト letters = ["A", "B", "C", "D", "E"] を逆順にして表示してください(2つの方法で)。

解答を見る

コード

letters = ["A", "B", "C", "D", "E"]

# 方法1: reverse()メソッド(元のリストを変更)
letters_copy1 = letters.copy()  # コピーを作成
letters_copy1.reverse()
print(f"方法1: {letters_copy1}")

# 方法2: スライス[::-1](新しいリストを作成)
letters_copy2 = letters[::-1]
print(f"方法2: {letters_copy2}")

実行結果

方法1: ['E', 'D', 'C', 'B', 'A']
方法2: ['E', 'D', 'C', 'B', 'A']

問題9:要素の検索(中級)

📋 問題

リスト colors = ["赤", "青", "緑", "青", "黄"] で、「青」が何個含まれているか数えてください。

解答を見る

コード

colors = ["赤", "青", "緑", "青", "黄"]

# count()で出現回数を数える
count = colors.count("青")
print(f"「青」の数: {count}個")

実行結果

「青」の数: 2個

問題10:リストの結合(中級)

📋 問題

2つのリスト list1 = [1, 2, 3]list2 = [4, 5, 6] を結合して、[1, 2, 3, 4, 5, 6] を作ってください。

解答を見る

コード

list1 = [1, 2, 3]
list2 = [4, 5, 6]

# 方法1: + 演算子で結合(新しいリストを作成)
result1 = list1 + list2
print(f"方法1: {result1}")

# 方法2: extend()で追加
list1_copy = list1.copy()  # 元のリストを変えないようコピー
list1_copy.extend(list2)
print(f"方法2: {list1_copy}")

実行結果

方法1: [1, 2, 3, 4, 5, 6]
方法2: [1, 2, 3, 4, 5, 6]

問題11:最大値・最小値(中級)

📋 問題

リスト scores = [85, 92, 78, 95, 88] の最高点と最低点を表示してください。

解答を見る

コード

scores = [85, 92, 78, 95, 88]

# max()で最大値を取得
highest = max(scores)
print(f"最高点: {highest}点")

# min()で最小値を取得
lowest = min(scores)
print(f"最低点: {lowest}点")

実行結果

最高点: 95点
最低点: 78点

問題12:リストのソート(中級)

📋 問題

リスト numbers = [3, 7, 1, 9, 2, 5] を昇順と降順の両方で並び替えて表示してください。

解答を見る

コード

numbers = [3, 7, 1, 9, 2, 5]

# sorted()で昇順(元のリストは変わらない)
ascending = sorted(numbers)
print(f"昇順: {ascending}")

# sorted()で降順(reverse=Trueを指定)
descending = sorted(numbers, reverse=True)
print(f"降順: {descending}")

実行結果

昇順: [1, 2, 3, 5, 7, 9]
降順: [9, 7, 5, 3, 2, 1]

問題13:偶数だけを抽出(上級)

📋 問題

リスト numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] から、偶数だけを新しいリストに抽出してください。

解答を見る

コード

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 空のリストを用意
even_numbers = []

# forループで各要素をチェック
for num in numbers:
    # 2で割った余りが0なら偶数
    if num % 2 == 0:
        even_numbers.append(num)

print(f"偶数: {even_numbers}")

実行結果

偶数: [2, 4, 6, 8, 10]

問題14:平均点の計算(上級)

📋 問題

5科目のテストの点数リスト scores = [85, 90, 78, 92, 88] について、合計点、平均点、最高点、最低点を計算して表示してください。

解答を見る

コード

scores = [85, 90, 78, 92, 88]

# sum()で合計点
total = sum(scores)
print(f"合計点: {total}点")

# 平均点 = 合計 ÷ 科目数
average = total / len(scores)
print(f"平均点: {average}点")

# max()で最高点
highest = max(scores)
print(f"最高点: {highest}点")

# min()で最低点
lowest = min(scores)
print(f"最低点: {lowest}点")

実行結果

合計点: 433点
平均点: 86.6点
最高点: 92点
最低点: 78点

問題15:リストの重複削除(上級)

📋 問題

リスト numbers = [1, 2, 3, 2, 4, 1, 5, 3, 6] から、重複を削除して、ユニークな要素だけのリストを作ってください。

ヒント: set()を使うと簡単です。

解答を見る

コード

numbers = [1, 2, 3, 2, 4, 1, 5, 3, 6]
print(f"元のリスト: {numbers}")

# set()で重複を削除してからlist()でリストに戻す
# setは重複を許さないデータ型
unique_numbers = list(set(numbers))
print(f"重複削除後: {unique_numbers}")

# ソートして見やすく
unique_numbers.sort()
print(f"ソート後: {unique_numbers}")

実行結果

元のリスト: [1, 2, 3, 2, 4, 1, 5, 3, 6]
重複削除後: [1, 2, 3, 4, 5, 6]
ソート後: [1, 2, 3, 4, 5, 6]

💡 解説

set()は重複を許さないデータ型です。リストをset()に変換すると自動的に重複が削除されます。

その後、list()でリストに戻します。

❓ よくある質問

Q1: append()とextend()の違いは?

append()は1つの要素(リスト全体も1つの要素)を追加します。

extend()はリストの各要素を個別に追加します。

[1,2].append([3,4])[1,2,[3,4]]

[1,2].extend([3,4])[1,2,3,4]

Q2: remove()とpop()の違いは?

remove()は値を指定して削除します(最初に見つかった1つだけ)。

pop()はインデックスを指定して削除し、削除した値を返します。

pop()は引数なしで使うと最後の要素を削除します。

Q3: リストのコピーはどうすればいい?

=で代入すると、同じリストへの参照になってしまいます。

リストをコピーするには、copy()メソッドか[:]スライスを使います。

new_list = old_list.copy() または new_list = old_list[:]

Q4: リストに異なる型のデータを入れていい?

はい、Pythonのリストは異なる型のデータを混在できます。

["文字列", 123, 3.14, True]のようなリストも作成できます。

ただし、同じ型のデータをまとめる方が、後の処理がしやすくなります。

Q5: インデックスが範囲外になるエラーを防ぐには?

アクセス前にlen()でリストの長さを確認しましょう。

または、負のインデックス[-1]を使えば、長さに関係なく最後の要素にアクセスできます。

🎉 ステップ7のまとめ

✅ このステップで学んだこと

✓ リストは複数のデータを順番に保存できる

✓ インデックスは0から始まる(負の数で後ろから)

✓ append()、insert()、extend()で要素を追加

✓ remove()、pop()、del、clear()で要素を削除

✓ インデックスで要素を変更できる

✓ スライスでリストの一部を取り出せる

✓ sort()、reverse()、count()、index()などのメソッド

✓ copy()やスライス[:]でリストをコピー

✓ sum()、max()、min()、len()の組み込み関数

💪 次のステップへ

リストの基礎をマスターしました!

リストは、プログラミングで最もよく使うデータ構造の1つです。

複数のデータをまとめて扱えるので、非常に便利です。

次のステップでは、タプルと辞書について学びます。

リストとは違う特徴を持つデータ構造を理解しましょう!

📝

学習メモ

Pythonプログラミング基礎 - Step 7

📋 過去のメモ一覧
#artnasekai #学習メモ
LINE