データを読み込み中...

この教材では、複数のデータをまとめて管理する「リスト」について学びます。リストと前回学んだループを組み合わせることで、大量のデータを効率的に処理できるようになります。
これまで学んできた変数は、1つの値しか保存できませんでした。しかし、実際のプログラムでは、複数の関連するデータをまとめて扱いたい場面が多くあります。
例えば、クラスの生徒の点数を管理することを考えてみましょう。
# リストを使わない場合
student1_score = 85
student2_score = 92
student3_score = 78
student4_score = 88
student5_score = 95
# 平均を計算するのも大変...
average = (student1_score + student2_score + student3_score +
student4_score + student5_score) / 5
これでは、生徒が増えるたびに変数を追加しなければならず、大変非効率です。
リストを使えば、このような複数のデータを1つにまとめて管理できます。
# リストを使う場合(効率的)
scores = [85, 92, 78, 88, 95]
# 平均を計算するのも簡単
average = sum(scores) / len(scores)
print("平均点: {}".format(average))
リストとは、複数のデータを順番に並べて保存できる「入れ物」です。箱がいくつも並んでいて、それぞれの箱に番号が振られているイメージです。
# リストの作成
fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]
# リストには様々なデータ型を入れられる
numbers = [10, 20, 30, 40, 50]
mixed = [1, "テスト", 3.14, True]
リストは角括弧[]を使って作成します。
# 空のリスト
empty_list = []
# 数値のリスト
numbers = [1, 2, 3, 4, 5]
# 文字列のリスト
colors = ["赤", "青", "黄色", "緑"]
# 混在したリスト
mixed = [100, "こんにちは", 3.14, True]
リストの各要素には、0から始まる番号(インデックス)が割り当てられます。
fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]
# インデックスで要素にアクセス
print(fruits[0]) # りんご(最初の要素)
print(fruits[1]) # バナナ(2番目の要素)
print(fruits[2]) # オレンジ(3番目の要素)
print(fruits[3]) # ぶどう(4番目の要素)
⚠️プログラミングにおいて、一番初めの値は0です。1から数えないように注意しましょう。
インデックス: 0 1 2 3
要素: ["りんご", "バナナ", "オレンジ", "ぶどう"]
Pythonでは、負のインデックスを使って後ろから要素にアクセスできます。
fruits = ["りんご", "バナナ", "オレンジ", "ぶどう"]
print(fruits[-1]) # ぶどう(最後の要素)
print(fruits[-2]) # オレンジ(後ろから2番目)
print(fruits[-3]) # バナナ(後ろから3番目)
print(fruits[-4]) # りんご(後ろから4番目)
インデックスを使って、リストの要素を変更できます。
numbers = [10, 20, 30, 40, 50]
print(numbers) # [10, 20, 30, 40, 50]
# 3番目の要素(インデックス2)を変更
numbers[2] = 99
print(numbers) # [10, 20, 99, 40, 50]
len()関数を使うと、リストの要素数を取得できます。
fruits = ["りんご", "バナナ", "オレンジ"]
print(len(fruits)) # 3
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(len(numbers)) # 10
append()は、リストの末尾に要素を1つ追加します。
fruits = ["りんご", "バナナ"]
print(fruits) # ['りんご', 'バナナ']
fruits.append("オレンジ")
print(fruits) # ['りんご', 'バナナ', 'オレンジ']
fruits.append("ぶどう")
print(fruits) # ['りんご', 'バナナ', 'オレンジ', 'ぶどう']
実用例:ショッピングカート
cart = []
cart.append("シャツ")
cart.append("ズボン")
cart.append("靴下")
print("カートの中身: {}".format(cart))
print("商品数: {}".format(len(cart)))
insert()は、指定した位置に要素を挿入します。
fruits = ["りんご", "バナナ", "ぶどう"]
print(fruits) # ['りんご', 'バナナ', 'ぶどう']
# インデックス1の位置に"オレンジ"を挿入
fruits.insert(1, "オレンジ")
print(fruits) # ['りんご', 'オレンジ', 'バナナ', 'ぶどう']
remove()は、指定した値を持つ要素を削除します。
fruits = ["りんご", "バナナ", "オレンジ", "バナナ"]
print(fruits) # ['りんご', 'バナナ', 'オレンジ', 'バナナ']
fruits.remove("バナナ")
print(fruits) # ['りんご', 'オレンジ', 'バナナ']
# 注意: 最初に見つかった"バナナ"だけが削除される
extend()は、別のリストの全要素を追加します。
fruits = ["りんご", "バナナ"]
more_fruits = ["オレンジ", "ぶどう", "メロン"]
fruits.extend(more_fruits)
print(fruits) # ['りんご', 'バナナ', 'オレンジ', 'ぶどう', 'メロン']
appendとextendの違い。
# appendの場合
list1 = [1, 2, 3]
list1.append([4, 5])
print(list1) # [1, 2, 3, [4, 5]] - リストごと追加される
# extendの場合
list2 = [1, 2, 3]
list2.extend([4, 5])
print(list2) # [1, 2, 3, 4, 5] - 要素が個別に追加される
リストとfor文を組み合わせることで、全要素に対して同じ処理を実行できます。
fruits = ["りんご", "バナナ", "オレンジ"]
for fruit in fruits:
print("{}が好きです".format(fruit))
実行結果:
りんごが好きです
バナナが好きです
オレンジが好きです
scores = [85, 92, 78, 88, 95, 73, 90]
# すべての点数を表示
print("=== テスト結果 ===")
for score in scores:
print("{}点".format(score))
# 合計と平均を計算
total = 0
for score in scores:
total += score
average = total / len(scores)
print("\n合計: {}点".format(total))
print("平均: 点".format(average))
# 80点以上の数をカウント
count = 0
for score in scores:
if score >= 80:
count += 1
print("80点以上: {}人".format(count))
既存のリストから、条件に合う要素だけを集めた新しいリストを作ることもできます。
scores = [85, 92, 78, 88, 95, 73, 90]
# 80点以上の点数だけを集める
high_scores = []
for score in scores:
if score >= 80:
high_scores.append(score)
print("80点以上の点数: {}".format(high_scores))
実行結果
80点以上の点数: [85, 92, 88, 95, 90]
enumerate()を使うと、リストの要素と一緒にインデックス(番号)も取得できます。
fruits = ["りんご", "バナナ", "オレンジ"]
for index, fruit in enumerate(fruits):
print("{}番目: {}".format(index, fruit))
実行結果
0番目: りんご
1番目: バナナ
2番目: オレンジ
enumerate()の2番目の引数で、開始番号を指定できます。
fruits = ["りんご", "バナナ", "オレンジ"]
for index, fruit in enumerate(fruits, 1): # 1から始める
print("{}番目: {}".format(index, fruit))
実行結果
1番目: りんご
2番目: バナナ
3番目: オレンジ
scores = [95, 92, 88, 85, 78]
names = ["田中", "佐藤", "鈴木", "高橋", "伊藤"]
print("=== 成績順位 ===")
for rank, (name, score) in enumerate(zip(names, scores), 1):
print("{}位: {} ({}点)".format(rank, name, score))
実行結果
=== 成績順位 ===
1位: 田中 (95点)
2位: 佐藤 (92点)
3位: 鈴木 (88点)
4位: 高橋 (85点)
5位: 伊藤 (78点)
スライスを使うと、リストの一部分を取り出すことができます。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# インデックス2から5まで(5は含まない)
print(numbers[2:5]) # [2, 3, 4]
# インデックス0から3まで
print(numbers[0:4]) # [0, 1, 2, 3]
# インデックス5から最後まで
print(numbers[5:]) # [5, 6, 7, 8, 9]
# 最初からインデックス5まで
print(numbers[:5]) # [0, 1, 2, 3, 4]
スライスには、ステップ(間隔)を指定することもできま。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 2つおきに取得
print(numbers[::2]) # [0, 2, 4, 6, 8]
# インデックス1から7まで、2つおきに取得
print(numbers[1:8:2]) # [1, 3, 5, 7]
# 逆順にする
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
# 週間売上データ
sales = [120, 150, 180, 200, 170, 250, 300]
days = ["月", "火", "水", "木", "金", "土", "日"]
# 平日の売上
weekday_sales = sales[:5]
print("平日の売上: {}".format(weekday_sales))
print("平日の平均: ".format(sum(weekday_sales) / len(weekday_sales)))
# 週末の売上
weekend_sales = sales[5:]
print("週末の売上: {}".format(weekend_sales))
print("週末の平均: ".format(sum(weekend_sales) / len(weekend_sales)))
これまで、条件に合う要素を集めて新しいリストを作る時は、以下のように書いていました。
# 0から4までの数値を2乗したリストを作る
squares = []
for i in range(5):
squares.append(i ** 2)
print(squares) # [0, 1, 4, 9, 16]
リスト内包表記を使うと、これを1行で簡潔に書けます。
# 同じ処理をリスト内包表記で書く
squares = [i ** 2 for i in range(5)]
print(squares) # [0, 1, 4, 9, 16]
リスト内包表記は、「for文を使ってリストを作る処理」を短く書くための便利な方法です。
基本的な書き方
[式 for 変数 in リストやrange()]
これは次のように読めます:
まずは簡単な例から見ていきましょう。
例1:1から10までの数値のリストを作る
numbers = [i for i in range(1, 11)]
print(numbers) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
例2:各要素を2倍にする
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
doubled = [n * 2 for n in numbers]
print(doubled) # [2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
例3:文字列のリストを大文字に変換
fruits = ["apple", "banana", "orange"]
upper_fruits = [fruit.upper() for fruit in fruits]
print(upper_fruits) # ['APPLE', 'BANANA', 'ORANGE']
どの例も、「リストの各要素に対して同じ処理をする」という共通点があります。
リスト内包表記にif文を追加すると、条件に合う要素だけを集めることができます。
例えば、「80点以上の点数だけを集めたい」という場合。
# これまでの書き方
scores = [85, 92, 78, 88, 95, 73, 90]
high_scores = []
for score in scores:
if score >= 80:
high_scores.append(score)
print(high_scores) # [85, 92, 88, 95, 90]
# リスト内包表記を使った書き方
scores = [85, 92, 78, 88, 95, 73, 90]
high_scores = [score for score in scores if score >= 80]
print(high_scores) # [85, 92, 88, 95, 90]
書き方
[式 for 変数 in リストやrange() if 条件]
これは次のように読めます。
実際のプログラムでよく使われる例を見てみましょう。
例1:価格リストに消費税を加算
prices = [1200, 800, 1500, 2000, 950]
prices_with_tax = [int(price * 1.1) for price in prices]
print("税込価格: {}".format(prices_with_tax))
# 税込価格: [1320, 880, 1650, 2200, 1045]
例2:偶数だけを2倍にする
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
doubled_evens = [n * 2 for n in numbers if n % 2 == 0]
print("偶数を2倍: {}".format(doubled_evens))
# 偶数を2倍: [4, 8, 12, 16, 20]
この例では、「条件(偶数かどうか)」と「処理(2倍にする)」の両方を1行で書いています。
例3:文字列の長さを取得
words = ["apple", "banana", "orange", "grape"]
lengths = [len(word) for word in words]
print("文字数: {}".format(lengths))
# 文字数: [5, 6, 6, 5]
各単語の長さを一度に調べることができます。
「条件に合う場合はAの処理、合わない場合はBの処理」のように、条件によって異なる計算をしたい場合もあります。
# 偶数は2倍、奇数は3倍にする
numbers = [1, 2, 3, 4, 5]
result = [n * 2 if n % 2 == 0 else n * 3 for n in numbers]
print(result) # [3, 4, 9, 8, 15]
# 60点以上は"合格"、未満は"不合格"
scores = [85, 55, 72, 48, 90]
results = ["合格" if score >= 60 else "不合格" for score in scores]
print(results) # ['合格', '不合格', '合格', '不合格', '合格']
書き方
[条件が真の時の式 if 条件 else 条件が偽の時の式 for 変数 in リストやrange()]
注意: if-elseを使う場合は、forの前に書きます(7.3のifとは位置が違います)
リスト内包表記は便利ですが、複雑な処理には向いていません。読みやすさを優先しましょう。
# ○ 良い例:シンプルで読みやすい
squares = [i ** 2 for i in range(10)]
# ○ 良い例:条件が1つだけで理解しやすい
evens = [i for i in range(20) if i % 2 == 0]
# × 悪い例:何をしているのか理解するのに時間がかかる
# このような複雑な処理は、普通のfor文を使うべき
result = [x * y for x in range(10) if x % 2 == 0
for y in range(10) if y % 3 == 0 if x + y < 15]
使い分けの目安
以下の要件を満たすプログラムを作成してください。
要件
tasksを作成する期待する出力例
買い物
料理
掃除
洗濯
タスク数: 4
ヒント
以下の要件を満たすプログラムを作成してください。
要件
prices = [1200, 800, 1500, 2000, 950]を作成するprices_with_taxに格納する期待する出力例
元の価格: 1200円 → 税込: 1320円
元の価格: 800円 → 税込: 880円
元の価格: 1500円 → 税込: 1650円
元の価格: 2000円 → 税込: 2200円
元の価格: 950円 → 税込: 1045円
合計: 7095円
ヒント
price * 1.1以下の要件を満たすプログラムを作成してください。
要件
students = ["田中", "佐藤", "鈴木", "高橋", "伊藤"]を作成するscores = [85, 92, 78, 88, 95]を作成する期待する出力例
1. 田中: 85点
2. 佐藤: 92点
3. 鈴木: 78点
4. 高橋: 88点
5. 伊藤: 95点
90点以上の生徒
佐藤
伊藤
ヒント:
以下の要件を満たすプログラムを作成してください。
要件
scoresを作成する期待する出力例
点数を入力してください(終了は-1): 85
点数を入力してください(終了は-1): 92
点数を入力してください(終了は-1): 78
点数を入力してください(終了は-1): 65
点数を入力してください(終了は-1): 88
点数を入力してください(終了は-1): -1
=== 集計結果 ===
全点数: [85, 92, 78, 65, 88]
最高点: 92点
最低点: 65点
平均点: 81.6点
60点以上: 5人
60点未満: 0人
ヒント
この教材では、以下の内容を学習しました
次の教材では、辞書(dict)について学習します。リストは順番でデータを管理しますが、辞書は「キーと値」のペアでデータを管理します。演習問題をしっかり解いて、リストをマスターしましょう。