Pythonには複数の要素をまとめて扱う「コレクション型」というデータ構造が標準で用意されています。
コレクション型を理解することで、データの整理や操作がぐっと楽になり、プログラムの可読性や保守性も向上します。
本記事では、初心者向けに以下の4つのコレクション型を丁寧に解説します。
- リスト(list)
- タプル(tuple)
- 辞書(dict)
- セット(set)
さらに、最後に「演習問題」と「解答例」を用意しました。学んだ内容を実際に手を動かして復習しましょう。
リスト(list)
1次元リストの基本
リストとは?
リストは順序付きの可変長シーケンスです。
要素の追加・削除が自由にでき、重複を許します。
fruits = ['apple', 'banana', 'orange']
主な操作
インデックスアクセス
print(fruits[0]) # 'apple'
print(fruits[-1]) # 'orange'
要素の追加・削除
fruits.append('grape') # 末尾に追加
fruits.insert(1, 'melon') # インデックス1に挿入
fruits.remove('banana') # 指定要素を削除
fruits.pop() # 末尾を取り出して削除
スライス
nums = [1, 2, 3, 4, 5]
print(nums[1:4]) # [2, 3, 4]
その他のメソッド
- len(list):長さを取得
- list.sort():昇順にソート
- list.reverse():順序を逆転
2次元リストの基本
作成方法
2次元リストは「リストのリスト」です。例えば、3行2列の表を表現できます。
# 3行2列の2次元リスト
matrix = [
[1, 2],
[3, 4],
[5, 6],
]
上記のmatrixは以下のようなイメージです。
マトリックス | 列1 | 列2 |
---|---|---|
行1 | 1 | 2 |
行2 | 3 | 4 |
行3 | 5 | 6 |
要素へのアクセス
最初の[行番号]
で行を指定し、その後の[列番号]
で列を指定します。
print(matrix[0][1]) # 2(1行目、2列目)
print(matrix[2][0]) # 5(3行目、1列目)
各種操作
全要素のループ
for row in matrix:
for item in row:
print(item, end=" ")
print()
出力
1 2
3 4
5 6
行や列の追加・削除
# 行の追加
matrix.append([7, 8])
# 列の追加(各行の末尾に要素を追加)
for row in matrix:
row.append(0)
# 行の削除
matrix.pop(1) # 2行目(インデックス1の行)を削除
# 列の削除(各行の末尾要素を削除)
for row in matrix:
row.pop()
リスト内包表記を使った初期化
# 4行3列のゼロ埋め2次元リスト
zero_matrix = [[0 for _ in range(3)] for _ in range(4)]
3次元リストの基本
作成方法
3次元リストは「2次元リストのリスト」です。例えば、2つの3行2列の「表」をまとめるイメージです。
# 2つの3×2マトリクスをまとめた3次元リスト
tensor = [
[
[1, 2],
[3, 4],
[5, 6],
],
[
[7, 8],
[9, 10],
[11, 12],
],
]
0番目のマトリックス | 列1 | 列2 |
---|---|---|
行1 | 1 | 2 |
行2 | 3 | 4 |
行3 | 5 | 6 |
1番目のマトリックス | 列1 | 列2 |
---|---|---|
行1 | 7 | 8 |
行2 | 9 | 10 |
行3 | 11 | 12 |
要素へのアクセス
tensor[マトリクス番号][行番号][列番号] の順に指定します。
print(tensor[0][1][1]) # 4:0番目マトリクスの2行2列目
print(tensor[1][2][0]) # 11:1番目マトリクスの3行1列目
各種操作
全要素のループ
for matrix in tensor:
for row in matrix:
for item in row:
print(item, end=" ")
print()
print("--- マトリクス区切り ---")
出力
1 2
3 4
5 6
--- マトリクス区切り ---
7 8
9 10
11 12
初期化例
# 2×3×4 の3次元リストをゼロ初期化
zeros_3d = [[[0 for _ in range(4)] for _ in range(3)] for _ in range(2)]
タプル(tuple)
タプルとは?
タプルはリストに似ていますが「不変(immutable)」です。定義後に要素の変更はできません。
point = (10, 20)
タプルの特徴と使い所
- 要素の更新・削除ができないので、関数の戻り値や定数データとして使うと安全。
- リストに比べてメモリ使用量が少しだけ少ない。
基本操作
x, y = point # アンパック
print(point[0]) # 10
print(len(point)) # 2
# point[0] = 5 # エラー:TypeError
辞書(dict)
辞書とは?
辞書は「キーと値」の組み合わせを管理するマッピング型です。キーは不変型(数値、文字列、タプルなど)しか使えません。
person = {
'name': 'Alice',
'age': 30,
'city': 'Tokyo'
}
主な操作
アクセス・更新
print(person['name']) # 'Alice'
person['age'] = 31 # 更新
person['job'] = 'Engineer' # 新規キー追加
キーの存在確認
if 'city' in person:
print('City:', person['city'])
キー・値の削除
del person['job']
person.pop('city') # 削除して値を返す
全要素の取得
for key, value in person.items():
print(key, '→', value)
セット(set)
セットとは?
セットは「重複を許さない順序なしコレクション」です。集合演算(和・積・差)などもサポート。
colors = {'red', 'green', 'blue'}
主な操作
追加・削除
colors.add('yellow')
colors.remove('green')
集合演算
a = {1, 2, 3}
b = {2, 3, 4}
print(a | b) # 和集合 {1,2,3,4}
print(a & b) # 積集合 {2,3}
print(a - b) # 差集合 {1}
その他
- len(set):要素数
- set.clear():全削除
enumerateを使用したコレクション操作
「何番目の要素か」を同時に取得したい場合、for 文とカウンタ変数を組み合わせる方法もありますが、よりシンプルに書けるのが enumerate 関数です。
enumerate とは?
enumerate は Python の組み込み関数のひとつで、以下のような特徴があります。
- イテラブル(リストやタプル、文字列など)を受け取り、「インデックス番号」と「要素」 のタプルを返す
- 内部でカウンタを用意してくれるため、手動で i += 1 のような処理が不要
- デフォルトでは 0 から始まるが、任意の開始番号を指定できる
>>> fruits = ["apple", "banana", "cherry"]
>>> for index, fruit in enumerate(fruits):
... print(index, fruit)
0 apple
1 banana
2 cherry
基本的な使い方
シンタックス(構文)
enumerate(iterable, start=0)
- iterable:リストやタプル、文字列など
- start:インデックス番号の開始値(省略時は 0)
例:リストのループで番号付き出力
names = ["Alice", "Bob", "Charlie"]
for idx, name in enumerate(names):
print(f"{idx}番目の名前は{name}です。")
実行結果
0番目の名前はAliceです。
1番目の名前はBobです。
2番目の名前はCharlieです。
開始カウントの変更
デフォルトの 0 ではなく、1 から数えたい場合は、start=1 を指定します。
for idx, name in enumerate(names, start=1):
print(f"{idx}番目の名前は{name}です。")
実行結果
1番目の名前はAliceです。
2番目の名前はBobです。
3番目の名前はCharlieです。
応用例
辞書のキーと値を同時にループ
辞書のキーと値を同時に扱うには items() を使いますが、番号も付けたいときは enumerate を組み合わせます。
person = {"name": "太郎", "age": 30, "city": "東京"}
for idx, (key, value) in enumerate(person.items(), start=1):
print(f"{idx}. {key} → {value}")
実行結果
1. name → 太郎
2. age → 30
3. city → 東京
リスト内包表記との組み合わせ
リスト内包表記でも enumerate を使えます。例えば「要素とその番号を組にしたタプルのリスト」を作る例です。
fruits = ["りんご", "みかん", "ぶどう"]
indexed = [(i, fruit) for i, fruit in enumerate(fruits)]
print(indexed)
# -> [(0, 'りんご'), (1, 'みかん'), (2, 'ぶどう')]
注意点
アンパックの漏れ
for item in enumerate(…) と書くと、ループ変数がタプル ((index, element)) になり、アンパックできません。
for tpl in enumerate(fruits):
print(tpl) # (0, 'りんご'), (1, 'みかん'), ...
アンパックするには for idx, fruit in enumerate(…) と書きます。
不要な変数
インデックス番号が不要な場合は、enumerate を使わず通常の for fruit in fruits: を使ったほうが可読性が高いです。
巨大リストへの影響
enumerate 自体はイテレータを返すだけなのでメモリ消費は少ないですが、リストの長さが非常に大きい場合はそもそものリスト自体が問題になります。
まとめ
型 | 可変性 | 重複許可 | 順序性 | 主な用途 |
---|---|---|---|---|
list | 可変 | ○ | ○ | シーケンス操作、順序管理 |
tuple | 不変 | ○ | ○ | 定数データ、関数の戻り値 |
dict | 可変 | –(キー) | –(キー) | キーと値のマッピング管理 |
set | 可変 | × | – | 重複排除、集合演算 |
演習問題
- リスト操作
nums = [1, 2, 3, 4, 5] の末尾に 6 を追加し、先頭の要素を削除してください。 - タプルのアンパック
coords = (100, 200, 300) をアンパックして変数 x, y, z に代入し、それぞれを表示してください。 - 辞書の更新とループ
student = {‘name’:’Bob’, ‘score’: 80} にキー grade を追加して値を ‘B’ に設定し、辞書の全キーと値をループで表示してください。 - セットの集合演算
A = {‘apple’, ‘orange’, ‘banana’} と B = {‘banana’, ‘kiwi’} の和集合と差集合を求めて表示してください。 - 応用問題
次の辞書 data = {‘a’:[1,2], ‘b’:(3,4), ‘c’:{5,6}} において、キー ‘a’ のリストに 3 を追加し、キー ‘b’ のタプルをアンパックして合計値を計算し、キー ‘c’ のセットに 7 を追加した後の data を表示してください。
解答例
# 1. リスト操作
nums = [1, 2, 3, 4, 5]
nums.append(6) # [1,2,3,4,5,6]
nums.pop(0) # 先頭を削除 → [2,3,4,5,6]
print(nums)
# 2. タプルのアンパック
coords = (100, 200, 300)
x, y, z = coords
print(x, y, z) # 100 200 300
# 3. 辞書の更新とループ
student = {'name':'Bob', 'score': 80}
student['grade'] = 'B'
for key, value in student.items():
print(f"{key} → {value}")
# name → Bob
# score → 80
# grade → B
# 4. セットの集合演算
A = {'apple', 'orange', 'banana'}
B = {'banana', 'kiwi'}
print("和集合:", A | B) # {'apple','orange','banana','kiwi'}
print("差集合:", A - B) # {'apple','orange'}
# 5. 応用問題
data = {'a':[1,2], 'b':(3,4), 'c':{5,6}}
# 'a'のリストに3を追加
data['a'].append(3) # [1,2,3]
# 'b'のタプルをアンパックして合計
b1, b2 = data['b']
sum_b = b1 + b2 # 7
print("bの合計:", sum_b)
# 'c'のセットに7を追加
data['c'].add(7) # {5,6,7}
print(data)
以上で「Pythonのコレクション型入門:リスト、タプル、辞書、セットを理解しよう」の解説を終わります。
各コレクション型の特徴を比較しつつ、実際に手を動かして学習することで、Pythonプログラミングの基礎力が確実に身につきます。
頑張って演習問題にも取り組んでみてください!