基礎

Pythonのタプル(tuple)|変更不可なデータの使い方

タプル(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,)
  • アンパックで複数の変数に一度に代入できる
  • リストより省メモリで処理が速い
  • 辞書のキーや関数の戻り値に活用できる