Pythonデータ構造

この講座では、Pythonの基本的なデータ構造について学びます。

  • リスト(list):複数の値を順番に格納する
  • 辞書(dict):キーと値のペアでデータを管理する
  • タプル(tuple):変更できないリスト
  • セット(set):重複しない値の集まり

1. 事前準備

この講座のハンズオンでは、以下のツールやアカウントが必要です。まだ準備できていない場合は、リンク先の手順に沿って準備をお願いします。

2. リスト(list)

リストは、複数の値を順番に格納できるデータ構造です。角括弧 [] で定義します。

💡 ポイント
リストは「同じ種類のデータをまとめて管理したい」ときに使います。例えば、ユーザ名の一覧、テストの点数、ファイル名のリストなど、複数の値をひとまとめにして順番に処理したい場面で活躍します。

2.1 リストの作成

リストは角括弧 [] の中に要素をカンマで区切って記述します。

変数名 = [要素1, 要素2, 要素3]

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。このプログラムは、4つのフルーツ名を持つリストを作成して表示するものです。

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

実行すると以下のように出力されます。

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

4つの要素がリストとして格納され、角括弧 [] で囲まれた形式で出力されています。

2.2 要素へのアクセス

リストの各要素には、インデックス(番号)を使ってアクセスできます。インデックスは 0 から始まります。main.py に以下の内容を記述して実行してみましょう。

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

print(fruits[0])
print(fruits[2])

実行すると以下のように出力されます。

りんご
オレンジ

fruits[0] は先頭の「りんご」、fruits[2] は3番目の「オレンジ」を取得しています。

2.3 要素の追加

append() を使うと、リストの末尾に新しい要素を追加できます。main.py に以下の内容を記述して実行してみましょう。

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

fruits.append("メロン")
print(fruits)

実行すると以下のように出力されます。

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

append("メロン") により、リストの末尾に「メロン」が追加されています。

2.4 要素数の取得

len() を使うと、リストに含まれる要素の数を取得できます。main.py に以下の内容を記述して実行してみましょう。

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

print(len(fruits))

実行すると以下のように出力されます。

4

リストに含まれる要素が4つなので、len() の結果として 4 が出力されています。

2.5 要素の削除

remove() を使うと、指定した値に一致する要素をリストから削除できます。main.py に以下の内容を記述して実行してみましょう。

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

fruits.remove("オレンジ")
print(fruits)

実行すると以下のように出力されます。

['りんご', 'バナナ', 'ぶどう']

remove("オレンジ") により、リストから「オレンジ」が削除され、残りの3要素が表示されています。

2.6 リストをforループで処理する

リストの要素を順番に処理するには、forループを使います。main.py に以下の内容を記述して実行してみましょう。

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

for fruit in fruits:
    print(f"{fruit} を処理中...")

実行すると以下のように出力されます。

りんご を処理中...
バナナ を処理中...
オレンジ を処理中...
ぶどう を処理中...

forループにより、リストの各要素が順番に変数 fruit に代入され、4回の print() が実行されています。

enumerate() を使うと、インデックス番号と要素を同時に取得できます。main.py に以下の内容を記述して実行してみましょう。

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

for index, fruit in enumerate(fruits):
    print(f"[{index}] {fruit}")

実行すると以下のように出力されます。

[0] りんご
[1] バナナ
[2] オレンジ
[3] ぶどう

enumerate() により、各要素にインデックス番号(0から始まる)が付与され、indexfruit に分けて取得できています。

💡 ポイント
CやJavaなどの言語にある固定長の「配列(array)」は、Pythonには標準で用意されていません。Pythonでは配列の代わりにリストを使うのが一般的です。リストは要素の追加や削除が自由にでき、配列よりも柔軟に扱えます。

3. 辞書(dict)

辞書は、キーと値のペアでデータを管理するデータ構造です。波括弧 {} で定義します。

💡 ポイント
辞書は「名前を付けてデータを管理したい」ときに使います。例えば、ユーザのプロフィール情報(名前・年齢・メールアドレス)や、設定ファイルの項目と値の組み合わせなど、「何のデータか」をキーで明示したい場面で活躍します。

3.1 辞書の作成

辞書は波括弧 {} の中にキーと値のペアをカンマで区切って記述します。キーと値は : で区切ります。

変数名 = {"キー1": 値1, "キー2": 値2}

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。このプログラムは、生徒情報をキーと値のペアで持つ辞書を作成して表示するものです。

student = {
    "name": "田中太郎",
    "age": 18,
    "grade": 3,
    "is_active": True
}

print(student)

実行すると以下のように出力されます。

{'name': '田中太郎', 'age': 18, 'grade': 3, 'is_active': True}

4つのキーと値のペアが辞書として格納され、波括弧 {} で囲まれた形式で出力されています。

3.2 値へのアクセス

辞書の値には、キーを指定してアクセスします。main.py に以下の内容を記述して実行してみましょう。

student = {
    "name": "田中太郎",
    "age": 18,
    "grade": 3,
    "is_active": True
}

print(student["name"])
print(student["age"])

実行すると以下のように出力されます。

田中太郎
18

student["name"] はキー "name" に対応する値「田中太郎」、student["age"] はキー "age" に対応する値 18 を取得しています。

3.3 値の更新

既存のキーに新しい値を代入すると、値を更新できます。main.py に以下の内容を記述して実行してみましょう。

student = {
    "name": "田中太郎",
    "age": 18,
    "grade": 3,
    "is_active": True
}

student["grade"] = 4
print(student["grade"])

実行すると以下のように出力されます。

4

student["grade"]4 を代入したことで、元の値 34 に更新されています。

3.4 要素の追加

存在しないキーに値を代入すると、新しい要素が追加されます。main.py に以下の内容を記述して実行してみましょう。

student = {
    "name": "田中太郎",
    "age": 18,
    "grade": 3,
    "is_active": True
}

student["club"] = "プログラミング部"
print(student)

実行すると以下のように出力されます。

{'name': '田中太郎', 'age': 18, 'grade': 3, 'is_active': True, 'club': 'プログラミング部'}

元の辞書に存在しなかったキー "club" に値を代入したことで、新しい要素が末尾に追加されています。

3.5 要素の削除

del を使うと、指定したキーの要素を辞書から削除できます。main.py に以下の内容を記述して実行してみましょう。

student = {
    "name": "田中太郎",
    "age": 18,
    "grade": 3,
    "is_active": True
}

del student["is_active"]
print(student)

実行すると以下のように出力されます。

{'name': '田中太郎', 'age': 18, 'grade': 3}

del によりキー "is_active" の要素が削除され、残りの3つの要素が表示されています。

3.6 辞書をforループで処理する

辞書のキーと値を順番に処理するには、.items() を使います。main.py に以下の内容を記述して実行してみましょう。

fruit_prices = {
    "りんご": 150,
    "バナナ": 100,
    "オレンジ": 200,
    "ぶどう": 350
}

for fruit, price in fruit_prices.items():
    print(f"{fruit} -> {price}円")

実行すると以下のように出力されます。

りんご -> 150円
バナナ -> 100円
オレンジ -> 200円
ぶどう -> 350円

.items() により、辞書の各キーと値のペアが順番に fruitprice に代入され、4つのフルーツとその価格が出力されています。

💡 ポイント
辞書の .items() はキーと値のペアを返します。キーだけを取得したい場合は .keys()、値だけを取得したい場合は .values() を使用します。

4. タプル(tuple)

タプルは、リストと似たデータ構造ですが、一度作成すると中身を変更できない(イミュータブルな)特性を持ちます。丸括弧 () で定義します。

4.1 タプルの作成

タプルは丸括弧 () の中に要素をカンマで区切って記述します。

変数名 = (要素1, 要素2, 要素3)

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。このプログラムは、3つの色名を持つタプルを作成して表示するものです。

primary_colors = ("赤", "青", "黄")
print(primary_colors)

実行すると以下のように出力されます。

('赤', '青', '黄')

3つの要素がタプルとして格納され、丸括弧 () で囲まれた形式で出力されています。

4.2 要素へのアクセス

リストと同様に、インデックスを使って要素にアクセスできます。main.py に以下の内容を記述して実行してみましょう。

primary_colors = ("赤", "青", "黄")

print(primary_colors[0])
print(primary_colors[2])

実行すると以下のように出力されます。

赤
黄

primary_colors[0] は先頭の「赤」、primary_colors[2] は3番目の「黄」を取得しています。リストと同じようにインデックスでアクセスできます。

4.3 要素数の取得

リストと同様に、len() で要素数を取得できます。main.py に以下の内容を記述して実行してみましょう。

primary_colors = ("赤", "青", "黄")

print(len(primary_colors))

実行すると以下のように出力されます。

3

タプルに含まれる要素が3つなので、len() の結果として 3 が出力されています。

4.4 要素の変更はできない

タプルはイミュータブル(変更不可)なため、要素を変更しようとするとエラーになります。main.py に以下の内容を記述して実行してみましょう。

primary_colors = ("赤", "青", "黄")

primary_colors[0] = "緑"

実行すると以下のようなエラーが出力されます。

TypeError: 'tuple' object does not support item assignment

このように、タプルは一度作成した内容を変更できないことが保証されています。

📝 リストとタプルの使い分け
値の変更が必要な場合はリスト、変更されるべきでない固定値にはタプルを使用します。例えば、曜日名や色名のように変更されるべきでない固定的なデータにはタプルが適しています。

5. セット(set)

セットは、重複しない値の集まりを管理するデータ構造です。波括弧 {} で定義します。リストと異なり、同じ値を複数持つことができず、要素の順序も保証されません。

💡 ポイント
セットは「重複を取り除きたい」「ある値が含まれているか素早く調べたい」ときに使います。例えば、ログに出てくるユーザIDの一覧から重複を除きたい場合や、許可リストに含まれるかどうかを判定したい場面で活躍します。

5.1 セットの作成

セットは波括弧 {} の中に要素をカンマで区切って記述します。

変数名 = {要素1, 要素2, 要素3}

実際に試してみましょう。main.py に以下の内容を記述して実行してみましょう。このプログラムは、フルーツ名のセットを作成して表示するものです。

fruits = {"りんご", "バナナ", "オレンジ", "ぶどう"}
print(fruits)

実行すると以下のように出力されます。

{'オレンジ', 'ぶどう', 'りんご', 'バナナ'}

4つの要素がセットとして格納され、波括弧 {} で囲まれた形式で出力されています。定義時とは異なる順番で表示されていることがわかります。

💡 ポイント
セットは要素の順序を保証しないため、表示される順番は実行のたびに異なる場合があります。

5.2 重複の自動除去

セットに同じ値を入れても、重複は自動的に除去されます。main.py に以下の内容を記述して実行してみましょう。

numbers = {1, 2, 3, 2, 1, 4, 3}
print(numbers)

実行すると以下のように出力されます。

{1, 2, 3, 4}

重複していた 1, 2, 3 がそれぞれ1つにまとめられています。

リストから重複を除去したい場合は、set() で変換してからリストに戻す方法がよく使われます。

names = ["田中", "鈴木", "田中", "佐藤", "鈴木"]

unique_names = list(set(names))
print(unique_names)

実行すると以下のように出力されます。

['鈴木', '佐藤', '田中']

リストにあった重複(「田中」「鈴木」がそれぞれ2つ)が set() で除去され、list() でリストに戻されたことで、重複のない3要素のリストになっています。

5.3 要素の追加と削除

セットに要素を追加するには add()、削除するには discard() を使います。main.py に以下の内容を記述して実行してみましょう。

fruits = {"りんご", "バナナ", "オレンジ"}

# 要素の追加
fruits.add("メロン")
print(fruits)

# 要素の削除
fruits.discard("バナナ")
print(fruits)

実行すると以下のように出力されます。

{'メロン', 'りんご', 'オレンジ', 'バナナ'}
{'メロン', 'りんご', 'オレンジ'}

1行目では add("メロン") により「メロン」が追加された4要素のセットが表示され、2行目では discard("バナナ") により「バナナ」が削除された3要素のセットが表示されています。

📝 discard() と remove() の違い
discard() は存在しない要素を指定してもエラーになりませんが、remove() は存在しない要素を指定すると KeyError が発生します。安全に削除したい場合は discard() を使いましょう。

5.4 要素の存在チェック

in を使うと、セットに特定の値が含まれているかを判定できます。main.py に以下の内容を記述して実行してみましょう。

allowed_users = {"admin", "editor", "viewer"}

user_role = "editor"
if user_role in allowed_users:
    print(f"{user_role} はアクセス許可されています")
else:
    print(f"{user_role} はアクセス拒否されました")

実行すると以下のように出力されます。

editor はアクセス許可されています

user_role の値 "editor"allowed_users セットに含まれているため、in の判定が True となり、アクセス許可のメッセージが出力されています。

💡 ポイント
in による存在チェックは、リストよりもセットの方が高速です。大量のデータから値を検索する場合はセットを使うと効率的です。

5.5 集合演算

セットでは、和集合・積集合・差集合といった集合演算ができます。main.py に以下の内容を記述して実行してみましょう。

team_a = {"田中", "鈴木", "佐藤", "高橋"}
team_b = {"鈴木", "伊藤", "高橋", "渡辺"}

# 和集合(どちらかに含まれる)
print(f"全メンバー: {team_a | team_b}")

# 積集合(両方に含まれる)
print(f"両方に所属: {team_a & team_b}")

# 差集合(Aにだけ含まれる)
print(f"Aだけに所属: {team_a - team_b}")

実行すると以下のように出力されます。

全メンバー: {'渡辺', '佐藤', '田中', '高橋', '伊藤', '鈴木'}
両方に所属: {'鈴木', '高橋'}
Aだけに所属: {'佐藤', '田中'}

|(和集合)では両チームの全メンバー6人が、&(積集合)では両方に所属する「鈴木」「高橋」が、-(差集合)ではAにだけ所属する「佐藤」「田中」が出力されています。

演算子 メソッド 説明
a | b a.union(b) 和集合(どちらかに含まれる要素)
a & b a.intersection(b) 積集合(両方に含まれる要素)
a - b a.difference(b) 差集合(aにだけ含まれる要素)

6. まとめ

この講座では、Pythonの基本的なデータ構造について学びました。

  • リストは順序付きの可変長コレクションで、append()remove() で要素を追加・削除できる
  • 辞書はキーと値のペアでデータを管理し、キーを指定して値にアクセスできる
  • タプルはリストと似ているが、一度作成すると変更できない(イミュータブル)
  • セットは重複しない値の集まりで、重複除去や集合演算(和・積・差)ができる