Pythonコレクション:リスト、タプル、辞書、集合

2025-10-23

はじめに

今回は、Pythonでデータを効率的に管理・操作するための4つの重要なデータ構造であるコレクション「リスト、タプル、辞書(以降:ディクショナリ)、集合(以降:セット)」について詳しく学びます。これらのコレクションは、現実世界の様々なデータを表現するために不可欠なツールです。

コレクションの重要性

コレクションは、データを効率的に整理、保存、操作する方法を提供します。適切なコレクションを選択することで以下のメリットがあります。

  • コードの可読性が向上する
  • 処理速度が速くなる
  • メモリ使用量が最適化される
  • データの操作が容易になる

コレクションのそれぞれを詳細に説明していきます。

リスト(List)

リストの基本

リストは、複数の要素を順序付けて格納できるデータ型です。異なるデータ型の要素を混在でき、要素の追加・変更・削除が可能な可変性を持ちます。角括弧[]で作成し、カンマ区切りで要素を並べます。データの整理や繰り返し処理に広く利用されます。

# リストの作成
fruits = ["apple", "banana", "orange", "grape"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True]

print(f"フルーツリスト: {fruits}")
print(f"数値リスト: {numbers}")
print(f"混合リスト: {mixed}")

リストの操作

インデックス指定による要素へのアクセス、スライスによる部分リストの取得、要素の変更、append()やinsert()を使った追加、pop()やremove()、delを用いた削除など、リストの基本的な操作を網羅しています。実行結果をコメントで示すことで、各操作がリストにどのような影響を与えるかを明確に理解できるようになっています。

# 要素のアクセスと変更
fruits = ["apple", "banana", "orange", "grape"]

print(f"最初の要素: {fruits[0]}")        # apple
print(f"最後の要素: {fruits[-1]}")       # grape
print(f"スライス: {fruits[1:3]}")       # ['banana', 'orange']

# 要素の変更
fruits[1] = "mango"
print(f"変更後: {fruits}")              # ['apple', 'mango', 'orange', 'grape']

# 要素の追加
fruits.append("peach")                  # 末尾に追加
fruits.insert(1, "kiwi")               # 指定位置に追加
print(f"追加後: {fruits}")

# 要素の削除
removed = fruits.pop()                  # 末尾を削除
print(f"削除された要素: {removed}")
fruits.remove("orange")                # 特定の要素を削除
del fruits[0]                          # インデックス指定で削除
print(f"削除後: {fruits}")

リストのメソッド

リストの長さや要素の出現回数を調べる基本的なメソッド、ソートや反転による並び替え、リストの結合方法を扱っています。さらに、簡潔な記述でリストを生成できるリスト内包表記も紹介しており、条件付きで偶数の平方数を求める応用的な使用例も含まれています。これらの操作を通して、リストの効率的な扱い方を学ぶことができます。

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

# 基本的なメソッド
print(f"リストの長さ: {len(numbers)}")
print(f"要素1の出現回数: {numbers.count(1)}")
print(f"要素9のインデックス: {numbers.index(9)}")

# ソート
numbers.sort()
print(f"昇順ソート: {numbers}")

numbers.sort(reverse=True)
print(f"降順ソート: {numbers}")

# 反転
numbers.reverse()
print(f"反転: {numbers}")

# リストの結合
list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list1 + list2
print(f"結合: {combined}")

# リスト内包表記
squares = [x**2 for x in range(1, 6)]
even_squares = [x**2 for x in range(1, 11) if x % 2 == 0]
print(f"平方数: {squares}")
print(f"偶数の平方数: {even_squares}")

タプル(Tuple)

タプルの基本

タプルはリストと似ていますが、一度作成すると要素の変更・追加・削除ができない不変性(immutable)が特徴です。丸括弧()で作成し、要素の順序を保持します。データの改変を防ぎたい場合や、ディクショナリのキーとして使用する場合などに利用されます。

# タプルの作成
colors = ("red", "green", "blue")
coordinates = (10, 20)
single_element = (42,)  # 要素が1つの場合はカンマが必要
mixed_tuple = (1, "hello", 3.14)

print(f"色のタプル: {colors}")
print(f"座標: {coordinates}")
print(f"単一要素: {single_element}")

# 要素のアクセス(リストと同じ)
print(f"最初の色: {colors[0]}")
print(f"最後の色: {colors[-1]}")
print(f"スライス: {colors[1:]}")

# タプルは不変なので以下の操作はエラー
# colors[0] = "yellow"  # TypeError

タプルの利点と使用場面

関数の戻り値として複数の値をまとめて返す方法、変更不可能な特性を活かしてディクショナリのキーとして使用する方法、データの不変性を利用して設定値など誤った変更を防ぎたい情報を保護する方法を実演しています。タプルの特徴である不変性が、それぞれの場面でどのように役立つかを具体的に理解できます。

# 関数の戻り値として(複数の値を返す)
def get_user_info():
    return "Alice", 25, "Tokyo"

name, age, city = get_user_info()
print(f"名前: {name}, 年齢: {age}, 都市: {city}")

# ディクショナリのキーとして(リストは不可)
locations = {
    (35.6895, 139.6917): "Tokyo",
    (40.7128, -74.0060): "New York"
}
print(f"東京の座標: {locations[(35.6895, 139.6917)]}")

# データの保護(誤って変更されるのを防ぐ)
config = ("localhost", 8080, "production")
print(f"設定: {config}")

辞書(Dictionary)

辞書(ディクショナリ)の基本

ディクショナリーはキーとバリューのペアを格納するコレクションです。波括弧{}で囲み、キーとバリューをコロン「:」で結んで定義します。キーを通じて対応するバリューに高速にアクセスでき、要素の追加・変更・削除が可能です。リストとは異なり、要素の順序は保証されませんが、キーによる直接アクセスという特性から、データベース的な役割を果たします。

# ディクショナリの作成
student = {
    "name": "Alice",
    "age": 20,
    "major": "Computer Science",
    "grades": [85, 92, 78]
}

person = dict(name="Bob", age=25, city="New York")

print(f"学生情報: {student}")
print(f"人物情報: {person}")

# 要素のアクセス
print(f"名前: {student['name']}")
print(f"年齢: {student.get('age')}")
print(f"存在しないキー: {student.get('height', '不明')}")

# 要素の追加と更新
student["email"] = "alice@example.com"  # 追加
student["age"] = 21                    # 更新
print(f"更新後: {student}")

# 要素の削除
removed_grade = student.pop("grades")  # キー指定で削除
print(f"削除された成績: {removed_grade}")
del student["major"]                   # del文で削除
print(f"削除後: {student}")

ディクショナリの操作

keys()、values()、items()メソッドによるディクショナリ内容の取得方法、キーまたは項目を用いた効率的なループ処理、簡潔な記法でディクショナリを生成する内包表記、そして複数のディクショナリを結合する方法を実演しています。各操作を通じて、ディクショナリの柔軟なデータ管理能力と、キーとバリューのペアを効果的に扱う手法を理解することができます。

# ディクショナリのメソッド
student = {"name": "Alice", "age": 20, "major": "CS"}

print(f"すべてのキー: {list(student.keys())}")
print(f"すべてのバリュー: {list(student.values())}")
print(f"すべての項目: {list(student.items())}")

# ループ処理
print("\nキーでループ:")
for key in student:
    print(f"  {key}: {student[key]}")

print("\n項目でループ:")
for key, value in student.items():
    print(f"  {key}: {value}")

# ディクショナリ内包表記
numbers = [1, 2, 3, 4, 5]
squares_dict = {x: x**2 for x in numbers}
print(f"平方辞書: {squares_dict}")

# ディクショナリの結合
dict1 = {"a": 1, "b": 2}
dict2 = {"c": 3, "d": 4}
combined = {**dict1, **dict2}
print(f"結合後: {combined}")

集合(Set)

集合の基本

セットは重複しない要素の順序なしコレクションを格納します。波括弧{}で作成し、数学の集合演算(和集合、積集合、差集合など)をサポートします。要素の追加・削除が可能ですが、変更不可能なオブジェクトのみを要素とし、リストやディクショナリなどは含めません。データの重複排除や集合演算が必要な場面で威力を発揮します。

# セットの作成
fruits = {"apple", "banana", "orange", "apple"}  # 重複は自動除去
numbers = set([1, 2, 3, 4, 5, 5, 5])           # リストから変換
empty_set = set()                              # 空セット

print(f"フルーツセット: {fruits}")    # {'banana', 'orange', 'apple'}
print(f"数値セット: {numbers}")       # {1, 2, 3, 4, 5}
print(f"空セット: {empty_set}")

# 要素の追加と削除
fruits.add("grape")
fruits.add("banana")  # 重複なので無視
fruits.remove("apple")
# fruits.remove("melon")  # 存在しない要素はKeyError
fruits.discard("melon")  # 安全な削除(エラーなし)

print(f"更新後: {fruits}")

集合演算

和集合・積集合・差集合・対称差集合といった基本的な集合演算を演算子を用いて実行し、部分集合や上位集合の関係性を確認する方法を実演しています。各演算結果から、セットがデータの比較やフィルタリング、数学的集合操作にどのように活用できるかを具体的に理解することができます。

set_a = {1, 2, 3, 4, 5}
set_b = {4, 5, 6, 7, 8}

# 和集合(union)
union = set_a | set_b
print(f"和集合: {union}")  # {1, 2, 3, 4, 5, 6, 7, 8}

# 積集合(intersection)
intersection = set_a & set_b
print(f"積集合: {intersection}")  # {4, 5}

# 差集合(difference)
difference = set_a - set_b
print(f"差集合 A-B: {difference}")  # {1, 2, 3}

# 対称差集合(symmetric difference)
symmetric_diff = set_a ^ set_b
print(f"対称差: {symmetric_diff}")  # {1, 2, 3, 6, 7, 8}

# 部分集合・上位集合
print(f"AはBの部分集合: {set_a <= set_b}")  # False
print(f"AはBの真部分集合: {set_a < set_b}")  # False
print(f"{{4,5}}はAの部分集合: {{4, 5}} <= set_a")  # True

コレクションの比較

ここまで説明した4つのコレクションを比較します。

特徴リストタプルディクショナリセット
変更可能
順序保持
重複許可
インデックスアクセス✅(キーで)
使用例データシーケンス固定データキーバリューペア一意な要素

パフォーマンス比較

リストとセットにおけるメンバーシップテスト(要素の存在確認)の性能差を実証しています。100万個の要素に対して特定の値が含まれるかをチェックする時間を計測し、リストが線形探索(O(n))であるのに対し、セットはハッシュベースの探索(O(1))であるため、はるかに高速であることを明確に示しています。大規模データにおける効率的な検索手法としてセットの優位性がわかります。

import time

# リスト vs 集合(メンバーシップテスト)
large_list = list(range(1000000))
large_set = set(range(1000000))

# リストのメンバーシップテスト
start = time.time()
999999 in large_list
end = time.time()
print(f"リストのメンバーシップテスト: {end - start:.6f}秒")

# セットのメンバーシップテスト
start = time.time()
999999 in large_set
end = time.time()
print(f"セットのメンバーシップテスト: {end - start:.6f}秒")

線形探索(O(n))は、データを先頭から順番に1つずつ確認して目的の値を探す方法です。特別な前処理が不要で、配列やリストがどのような順序であってもそのまま使えるのが特徴です。ただし、要素数が増えるほど確認回数も増えるため、最悪の場合はすべての要素を調べる必要があり、処理時間はデータ数に比例して遅くなります。シンプルで実装しやすい一方、大規模データには不向きです。

一方、ハッシュベースの探索(O(1))は、ハッシュ関数を使ってデータの格納場所をあらかじめ決めておき、その位置に直接アクセスすることで高速に検索する方法です。理想的にはデータ数に関係なく一定時間で検索できるため、非常に高速です。ただし、ハッシュ関数の設計や衝突(異なるデータが同じ場所に割り当てられる現象)への対処が必要であり、メモリ使用量も多くなる傾向があります。また、順序性は基本的に保証されません。


■ 対比表

項目線形探索(O(n))ハッシュベース探索(O(1))
探索方法先頭から順番に確認ハッシュ値で直接アクセス
計算量O(n)O(1)(平均)
データ構造配列・リストなどハッシュテーブル(ディクショナリ・セット)
前処理不要必要(ハッシュ化)
速度遅い(データ量に依存)速い(ほぼ一定時間)
メモリ使用量少ない多い傾向
順序性保持される基本的に保証されない
実装の容易さ簡単やや複雑
衝突の影響なしあり(対処が必要)

メモリとパフォーマンスの考慮

コレクションにおけるメモリ使用量を比較検証しています。同じ要素数(5つの整数)を持つリスト、タプル、ディクショナリ、セットのメモリ消費量をsys.getsizeof()関数で測定し、各データ型のメモリ効率の違いを数値的に示しています。コレクションの選択がメモリ使用量に与える影響を理解するための実践的な計測例となっています。

import sys

# メモリ使用量の比較
list_data = [1, 2, 3, 4, 5]
tuple_data = (1, 2, 3, 4, 5)
set_data = {1, 2, 3, 4, 5}
dict_data = {1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e'}

print(f"リストのメモリ使用量: {sys.getsizeof(list_data)} bytes")
print(f"タプルのメモリ使用量: {sys.getsizeof(tuple_data)} bytes")
print(f"セットのメモリ使用量: {sys.getsizeof(set_data)} bytes")
print(f"ディクショナリのメモリ使用量: {sys.getsizeof(dict_data)} bytes")

実践的な使用例

データ分析の例

ディクショナリとリストを組み合わせた実践的な学生成績管理システムです。各学生の情報をディクショナリで表現し、それらをリストで管理しています。平均点の計算、専攻ごとの学生のグループ化を行い、データの集計と整理方法を示しています。ループ処理とディクショナリ操作を活用することで、現実的なデータ処理タスクを効率的に実行する方法を実証しています。

# 学生の成績管理システム
students = [
    {"name": "Alice", "grades": [85, 92, 78], "major": "CS"},
    {"name": "Bob", "grades": [76, 88, 95], "major": "Math"},
    {"name": "Charlie", "grades": [90, 85, 92], "major": "CS"},
    {"name": "Diana", "grades": [65, 70, 75], "major": "Physics"}
]

# 各学生の平均点を計算
for student in students:
    grades = student["grades"]
    average = sum(grades) / len(grades)
    student["average"] = round(average, 2)

# 専攻ごとの学生をグループ化
majors = {}
for student in students:
    major = student["major"]
    if major not in majors:
        majors[major] = []
    majors[major].append(student)

# 結果の表示
print("学生の成績:")
for student in students:
    print(f"{student['name']}: 平均 {student['average']}点")

print("\n専攻別学生:")
for major, students_in_major in majors.items():
    names = [s["name"] for s in students_in_major]
    print(f"{major}: {', '.join(names)}")

テキスト処理の例

テキスト分析を行う実践的な関数を実装しています。文字列操作、ディクショナリ、セットを組み合わせて、総単語数、ユニーク単語数、単語の出現頻度、最も頻出する単語トップ5を計算します。具体的には、テキストを単語に分割し、ディクショナリで頻度を集計し、セットでユニーク単語を管理することで、効率的なテキスト分析の手法を示しています。実際のデータ処理でよく使われる技術を網羅した例です。

def analyze_text(text):
    """テキストを分析する関数"""
    # 単語のリストを作成
    words = text.lower().split()

    # 単語の頻度を計算
    word_freq = {}
    for word in words:
        # 句読点を除去
        word = word.strip('.,!?;:"')
        if word:
            word_freq[word] = word_freq.get(word, 0) + 1

    # ユニークな単語のセット
    unique_words = set(words)

    # 結果を返す
    return {
        "total_words": len(words),
        "unique_words": len(unique_words),
        "word_frequency": word_freq,
        "most_common": sorted(word_freq.items(), key=lambda x: x[1], reverse=True)[:5]
    }

# 使用例
sample_text = """
Python is a powerful programming language. Python is easy to learn and use.
Python has many libraries for data analysis. Python is popular for web development.
"""

analysis = analyze_text(sample_text)
print(f"総単語数: {analysis['total_words']}")
print(f"ユニーク単語数: {analysis['unique_words']}")
print(f"最も頻出する単語: {analysis['most_common']}")

設定管理の例

変更不可なシステム設定にはタプルを、ユーザー設定には柔軟なディクショナリを使用し、関数でこれらを統合しています。タプルの不変性による設定の保護、ディクショナリの柔軟性によるユーザーカスタマイズ、セットを用いた機能管理など、各データ型の特性を活かした設計が特徴です。現実的なアプリケーション設定のモデルとして参考になります。

# アプリケーションの設定
DEFAULT_CONFIG = (
    "localhost",    # host
    8080,           # port
    True,           # debug_mode
    "production",   # environment
)

# ユーザー設定(ディクショナリ)
user_settings = {
    "theme": "dark",
    "language": "ja",
    "notifications": True,
    "font_size": 14,
    "shortcuts": {"save": "Ctrl+S", "undo": "Ctrl+Z"}
}

# システム設定(変更不可なタプル)
SYSTEM_SETTINGS = (
    "1.0.0",        # version
    "UTF-8",        # encoding
    1000,           # max_connections
)

def create_app_config(host, port, user_preferences):
    """アプリケーション設定を作成"""
    config = {
        "connection": (host, port),
        "system": SYSTEM_SETTINGS,
        "user": user_preferences,
        "features": {"api", "database", "cache"}  # 利用可能な機能
    }
    return config

# 設定の作成と使用
app_config = create_app_config("127.0.0.1", 3000, user_settings)
print("アプリケーション設定:")
for key, value in app_config.items():
    print(f"  {key}: {value}")

まとめ

今回は、Pythonにおける4つの主要なコレクションについて学びました。リストは順序付けられた可変のシーケンスであり、要素の追加や変更が可能です。タプルは同じく順序を持ちますが不変であり、一度作成すると内容を変更できません。ディクショナリはキーとバリューのペアで構成されるコレクションで、特定のキーを使って効率的にバリューへアクセスできます。セットは重複しない要素のみを扱う無順序のコレクションで、要素の存在確認やセット演算に適しています。

また、各コレクションにはそれぞれ適した用途と利点があり、適切に選択することがプログラムのパフォーマンスに大きく影響することも重要なポイントです。さらに、リスト内包表記やディクショナリ内包表記を活用することで、より簡潔で読みやすいコードを書くことができます。加えて、これらのコレクションを組み合わせることで、より複雑なデータを柔軟に表現することが可能になります。

これらのコレクションを適切に使い分けることで、効率的で読みやすいコードを書くことができます。次の講義では、ファイル操作について学び、データの永続化について理解を深めます。

練習問題

初級問題(3問)

問題1

1から10までの数値を含むリストを作成し、以下の操作を行うプログラムを作成してください。

  1. リストの内容を表示
  2. リストの長さを表示
  3. リストの最後に11を追加
  4. リストの先頭を削除
  5. 最終的なリストを表示

実行結果:

元のリスト: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
リストの長さ: 10
11を追加後: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
削除された要素: 1
先頭削除後: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
最終的なリスト: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
最終的な長さ: 10

問題2

以下のタプルから要素(インデックス)を取り出して、以下の実行結果を示してください。

person = ("山田", "太郎", 25, "東京")

実行結果:

"山田太郎さんは25歳で東京に住んでいます"

問題3

以下のディクショナリを作成し、すべてのキー、すべてのバリュー、すべてのキーとバリューのペアを表示してください。

student = {
    "name": "Alice",
    "age": 20,
    "major": "Computer Science",
    "gpa": 3.8
}

実行結果:

学生情報:
Alice, 20, Computer Science, 3.8

keys()
dict_keys(['name', 'age', 'major', 'gpa'])

values()
dict_values(['Alice', 20, 'Computer Science', 3.8])

items()
dict_items([('name', 'Alice'), ('age', 20), ('major', 'Computer Science'), ('gpa', 3.8)])

中級問題(6問)

問題4

数値のリストを受け取り、平均値・最大値・最小値・合計・件数を計算する関数を作成してください。結果はディクショナリ形式で返してください。数値のリスト numbers = [10, 20, 30, 40, 50]

{
    'average': 30.0,
    'max': 50,
    'min': 10,
    'sum': 150,
    'count': 5
}

問題5

2つのリストを受け取り、それらの共通要素を見つけてセットとして返す関数を作成してください。

# 固定のリスト
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]

# 実行結果
{4, 5}

問題6

「"Hello world! Hello Python. Python is great."」という文章を受け取り、単語の頻度をディクショナリで返す関数を作成してください。大文字小文字を区別せず、句読点は無視してください。

{
    'hello': 2,
    'world': 1,
    'python': 2,
    'is': 1,
    'great': 1
}

問題7

学生の成績データを管理するプログラムを作成してください。

  • 各学生は名前と複数の科目の点数を持つ
  • 平均点を計算
  • 最高点と最低点を見つける

実行結果:

名前: Alice
平均点: 80.0
最高点: 90
最低点: 70

名前: Bob
平均点: 73.33333333333333
最高点: 85
最低点: 60

名前: Charlie
平均点: 90.0
最高点: 95
最低点: 85

問題8

リスト内包表記を使用して、以下のリストを作成してください。

①1から20までの偶数のリスト

②1から10までの数の平方根のリスト(小数第2位まで)

③与えられた文字列リスト["apple", "cat", "elephant", "dog", "computer", "hi", "programming"]から、長さが5文字以上の文字列だけを抽出したリスト

実行結果:

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[1.0, 1.41, 1.73, 2.0, 2.24, 2.45, 2.65, 2.83, 3.0, 3.16]
['apple', 'elephant', 'computer', 'programming']

問題9

2つのディクショナリを結合する関数を作成してください。同じキーがある場合は、第2のディクショナリのバリューで上書きしてください。二つのディクショナリは以下の通りです。

dict1 = {"name": "Alice", "age": 20}
dict2 = {"age": 25, "city": "Tokyo"}

実行結果:

{'name': 'Alice', 'age': 25, 'city': 'Tokyo'}

上級問題(3問)

問題10

2つの同じ大きさの2次元リストを受け取り、対応する数値を足し算した新しい2次元リストを返すプログラムを作成してください。

例えば、

[ [1, 2], [3, 4] ]

[ [5, 6], [7, 8] ]

を足し算すると、

[ [6, 8], [10, 12] ]

になります。

問題11

商品名と価格をディクショナリで管理し、商品の合計金額を計算するプログラムを作成してください。

さらに、一番高い商品と一番安い商品も表示してください。

次の商品を使ってください。

  • りんご:100円
  • バナナ:80円
  • オレンジ:120円
  • メロン:500円

問題12

学生ごとの複数科目の点数をディクショナリで管理し、次の内容を分析するプログラムを作成してください。

  • 各学生の平均点
  • 平均点による順位
  • 科目ごとの平均点
  • 全学生の全体平均点

実行結果:

順位一覧
1 位 Charlie 91.0
2 位 Alice 80.0
3 位 Bob 73.33333333333333

科目別平均
Math 76.66666666666667
English 86.66666666666667
Science 81.0

全体平均点
81.44444444444444

練習問題 解答

初級問題 解答

問題1 解答

# 1から10までの数値リストを作成
numbers = list(range(1, 11))
print(f"元のリスト: {numbers}")

# リストの長さを表示
print(f"リストの長さ: {len(numbers)}")

# リストの最後に11を追加
numbers.append(11)
print(f"11を追加後: {numbers}")

# リストの先頭を削除
removed_element = numbers.pop(0)
print(f"削除された要素: {removed_element}")
print(f"先頭削除後: {numbers}")

# 最終的なリストを表示
print(f"最終的なリスト: {numbers}")
print(f"最終的な長さ: {len(numbers)}")

実行結果

元のリスト: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
リストの長さ: 10
11を追加後: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
削除された要素: 1
先頭削除後: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
最終的なリスト: [2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
最終的な長さ: 10

問題2 解答

# タプルから要素を取り出して文字列を作成
person = ("山田", "太郎", 25, "東京")

# インデックスでアクセス
introduction1 = f"{person[0]}{person[1]}さんは{person[2]}歳で{person[3]}に住んでいます"
print(f"方法1: {introduction1}")

実行結果

山田太郎さんは25歳で東京に住んでいます

問題3 解答

# 学生情報のディクショナリ
student = {
    "name": "Alice",
    "age": 20,
    "major": "Computer Science",
    "gpa": 3.8
}

print("学生情報:")

# バリューをカンマ区切りで表示
print(student["name"], student["age"], student["major"], student["gpa"], sep=", ")

# keys() を表示
print("\nkeys()")
print(student.keys())

# values() を表示
print("\nvalues()")
print(student.values())

# items() を表示
print("\nitems()")
print(student.items())

実行結果

学生情報:
Alice, 20, Computer Science, 3.8

keys()
dict_keys(['name', 'age', 'major', 'gpa'])

values()
dict_values(['Alice', 20, 'Computer Science', 3.8])

items()
dict_items([('name', 'Alice'), ('age', 20), ('major', 'Computer Science'), ('gpa', 3.8)])

中級問題 解答

問題4 解答

def calculate_statistics(numbers):

    total = sum(numbers)
    count = len(numbers)
    average = total / count

    return {
        "average": average,
        "max": max(numbers),
        "min": min(numbers),
        "sum": total,
        "count": count
    }

# 固定のデータ
numbers = [10, 20, 30, 40, 50]

# 関数実行
stats = calculate_statistics(numbers)

# 結果表示
print(stats)

実行結果

{
    'average': 30.0,
    'max': 50,
    'min': 10,
    'sum': 150,
    'count': 5
}

問題5 解答

def find_common_elements(list1, list2):

    set1 = set(list1)
    set2 = set(list2)

    common = set1 & set2

    return common


# 固定のリスト
list1 = [1, 2, 3, 4, 5]
list2 = [4, 5, 6, 7, 8]

# 関数実行
result = find_common_elements(list1, list2)

# 結果表示
print(result)

実行結果

{4, 5}

問題6 解答

import string

def count_word_frequency(text):

    # 句読点を削除して小文字に変換
    translator = str.maketrans("", "", string.punctuation)
    clean_text = text.translate(translator).lower()

    # 単語に分割
    words = clean_text.split()

    # 単語の出現回数を数える
    word_freq = {}

    for word in words:
        word_freq[word] = word_freq.get(word, 0) + 1

    return word_freq


# 固定の文章
text = "Hello world! Hello Python. Python is great."

# 関数実行
result = count_word_frequency(text)

# 結果表示
print(result)

実行結果

{
    'hello': 2,
    'world': 1,
    'python': 2,
    'is': 1,
    'great': 1
}

問題7 解答

# 学生の成績データ
students = [
    {"name": "Alice", "grades": [80, 90, 70]},
    {"name": "Bob", "grades": [60, 75, 85]},
    {"name": "Charlie", "grades": [90, 95, 85]}
]

# 各学生の平均点を計算
for student in students:

    grades = student["grades"]

    average = sum(grades) / len(grades)

    highest = max(grades)

    lowest = min(grades)

    print("名前:", student["name"])
    print("平均点:", average)
    print("最高点:", highest)
    print("最低点:", lowest)
    print()

実行結果

名前: Alice
平均点: 80.0
最高点: 90
最低点: 70

名前: Bob
平均点: 73.33333333333333
最高点: 85
最低点: 60

名前: Charlie
平均点: 90.0
最高点: 95
最低点: 85

問題8 解答

import math

# ① 1から20までの偶数のリスト
even_numbers = [x for x in range(1, 21) if x % 2 == 0]
print(even_numbers)

# ② 1から10までの数の平方根のリスト
square_roots = [round(math.sqrt(x), 2) for x in range(1, 11)]
print(square_roots)

# ③ 5文字以上の文字列だけを抽出
words = ["apple", "cat", "elephant", "dog", "computer", "hi", "programming"]

long_words = [word for word in words if len(word) >= 5]

print(long_words)

実行結果

[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
[1.0, 1.41, 1.73, 2.0, 2.24, 2.45, 2.65, 2.83, 3.0, 3.16]
['apple', 'elephant', 'computer', 'programming']

問題9 解答

def merge_dicts(dict1, dict2):

    result = dict1.copy()

    result.update(dict2)

    return result


# 固定の辞書
dict1 = {"name": "Alice", "age": 20}

dict2 = {"age": 25, "city": "Tokyo"}


# 関数実行
merged = merge_dicts(dict1, dict2)


# 結果表示
print(merged)

実行結果

{'name': 'Alice', 'age': 25, 'city': 'Tokyo'}

上級問題 解答

問題10 解答

def matrix_addition(matrix1, matrix2):

    result = []

    for i in range(len(matrix1)):

        row = []

        for j in range(len(matrix1[0])):

            value = matrix1[i][j] + matrix2[i][j]

            row.append(value)

        result.append(row)

    return result


# 固定の行列
matrix1 = [
    [1, 2],
    [3, 4]
]

matrix2 = [
    [5, 6],
    [7, 8]
]

# 関数実行
answer = matrix_addition(matrix1, matrix2)

# 結果表示
print(answer)

実行結果

[[6, 8], [10, 12]]

問題11 解答

# 商品データ
cart = {
    "りんご": 100,
    "バナナ": 80,
    "オレンジ": 120,
    "メロン": 500
}

# 商品一覧を表示
print("商品一覧")
print(cart)

# 合計金額
total = sum(cart.values())

# 一番高い商品
highest_item = max(cart, key=cart.get)

# 一番安い商品
lowest_item = min(cart, key=cart.get)

# 結果表示
print("合計金額:", total)

print("一番高い商品:", highest_item, cart[highest_item])

print("一番安い商品:", lowest_item, cart[lowest_item])

実行結果

商品一覧
{'りんご': 100, 'バナナ': 80, 'オレンジ': 120, 'メロン': 500}

合計金額: 800

一番高い商品: メロン 500

一番安い商品: バナナ 80

問題12 解答

# 学生データ
students = [
    {
        "name": "Alice",
        "scores": {
            "Math": 80,
            "English": 90,
            "Science": 70
        }
    },
    {
        "name": "Bob",
        "scores": {
            "Math": 60,
            "English": 75,
            "Science": 85
        }
    },
    {
        "name": "Charlie",
        "scores": {
            "Math": 90,
            "English": 95,
            "Science": 88
        }
    }
]

# 学生ごとの平均点
results = []

for student in students:

    scores = student["scores"].values()

    average = sum(scores) / len(scores)

    results.append({
        "name": student["name"],
        "average": average
    })

# 平均点順に並べ替え
ranking = sorted(
    results,
    key=lambda x: x["average"],
    reverse=True
)

# 順位表示
print("順位一覧")

for i, student in enumerate(ranking, 1):

    print(i, "位", student["name"], student["average"])

# 科目ごとの平均点
subjects = ["Math", "English", "Science"]

print("\n科目別平均")

for subject in subjects:

    total = 0

    for student in students:

        total += student["scores"][subject]

    average = total / len(students)

    print(subject, average)

# 全体平均点
all_scores = []

for student in students:

    for score in student["scores"].values():

        all_scores.append(score)

overall_average = sum(all_scores) / len(all_scores)

print("\n全体平均点")
print(overall_average)

実行結果

順位一覧
1 位 Charlie 91.0
2 位 Alice 80.0
3 位 Bob 73.33333333333333

科目別平均
Math 76.66666666666667
English 86.66666666666667
Science 81.0

全体平均点
81.44444444444444