タプル(tuple)は、リストと同様に複数のデータを格納できるデータ構造ですが、一度作成すると要素を変更できない(イミュータブル)という特徴があります。変更されたくないデータを安全に扱いたい場合に使います。
この記事では、タプルの基本的な使い方から、リストとの違い、実践的な活用方法まで詳しく解説します。
基本的な使い方
タプルは丸括弧 () で作成します。要素はカンマで区切ります。
Python
# タプルの作成
colors = ("赤", "青", "緑")
numbers = (1, 2, 3, 4, 5)
single = (42,) # 要素1つの場合はカンマが必要
empty = () # 空のタプル
print(colors)
print(f"要素数: {len(colors)}")
# インデックスでアクセス
print(colors[0]) # 赤
print(colors[-1]) # 緑
# 括弧を省略してもOK
point = 10, 20
print(point)
print(type(point))
実行結果
('赤', '青', '緑')
要素数: 3
赤
緑
(10, 20)
<class 'tuple'>
要素1つのタプルにはカンマが必要
(42) はただの数値 42 になります。要素が1つのタプルを作るには (42,) のようにカンマを付ける必要があります。
タプルは変更できない
タプルの最大の特徴は、作成後に要素を変更・追加・削除できないことです。
Python
colors = ("赤", "青", "緑")
# 以下はすべてエラーになる
# colors[0] = "黄" # TypeError
# colors.append("白") # AttributeError
# del colors[0] # TypeError
# 新しいタプルを作ることは可能
new_colors = colors + ("黄", "白")
print(new_colors)
実行結果
('赤', '青', '緑', '黄', '白')
タプルのアンパック
タプルの要素を複数の変数に一度に代入できます。これを「アンパック」と呼びます。
Python
# 基本的なアンパック
point = (10, 20, 30)
x, y, z = point
print(f"x={x}, y={y}, z={z}")
# 変数の交換(内部的にタプルを利用)
a, b = 1, 2
a, b = b, a
print(f"a={a}, b={b}")
# *でまとめて受け取る
first, *rest = (1, 2, 3, 4, 5)
print(f"first={first}, rest={rest}")
head, *middle, tail = (1, 2, 3, 4, 5)
print(f"head={head}, middle={middle}, tail={tail}")
実行結果
x=10, y=20, z=30
a=2, b=1
first=1, rest=[2, 3, 4, 5]
head=1, middle=[2, 3, 4], tail=5
リストとタプルの違い
リストとタプルの主な違いは以下の通りです。
Python
import sys
# メモリ使用量の比較
list_data = [1, 2, 3, 4, 5]
tuple_data = (1, 2, 3, 4, 5)
print(f"リスト: {sys.getsizeof(list_data)}バイト")
print(f"タプル: {sys.getsizeof(tuple_data)}バイト")
# 変換
print(list(tuple_data)) # タプル → リスト
print(tuple(list_data)) # リスト → タプル
実行結果
リスト: 104バイト
タプル: 80バイト
[1, 2, 3, 4, 5]
(1, 2, 3, 4, 5)
タプルを使うべき場面
データが変更されないことを保証したい場合(座標、RGB値、設定値など)、辞書のキーとして使いたい場合、関数から複数の値を返す場合にタプルが適しています。また、タプルはリストよりメモリ効率が良く、処理速度もわずかに速いです。
実践的な使い方
Python
# 関数から複数の値を返す
def get_stats(numbers):
return min(numbers), max(numbers), sum(numbers) / len(numbers)
data = [85, 72, 90, 68, 95]
low, high, avg = get_stats(data)
print(f"最小: {low}, 最大: {high}, 平均: {avg:.1f}")
# 辞書のキーとして使う
locations = {}
locations[(35.68, 139.77)] = "東京"
locations[(34.69, 135.50)] = "大阪"
for coords, city in locations.items():
print(f"{city}: 緯度{coords[0]}, 経度{coords[1]}")
実行結果
最小: 68, 最大: 95, 平均: 82.0
東京: 緯度35.68, 経度139.77
大阪: 緯度34.69, 経度135.5
まとめ
- タプルは
()で作成し、要素を変更できない(イミュータブル) - 要素1つのタプルには末尾にカンマが必要:
(42,) - アンパックで複数の変数に一度に代入できる
- リストより省メモリで処理が速い
- 辞書のキーや関数の戻り値に活用できる