「pythonでタプルってよく見るけど、何に使うの?」
「リストとの違いがよくわからない…」
そんな疑問を解決するために、今回はタプル(tuple)について、初心者の方でも理解できるように詳しく説明していきます。
タプルとは?「変更できないリスト」のようなもの

タプルは、複数の値をまとめて保持するためのデータ型です。
リストと似ていますが、一度作成すると中身を変更できないという重要な違いがあります。
タプルの基本的な作り方
# 基本的なタプルの作成
fruits_tuple = ("りんご", "バナナ", "みかん")
print(fruits_tuple) # ('りんご', 'バナナ', 'みかん')
# 数値のタプル
numbers_tuple = (1, 2, 3, 4, 5)
print(numbers_tuple) # (1, 2, 3, 4, 5)
# 異なる型の要素を混在させることも可能
mixed_tuple = ("太郎", 25, True, 3.14)
print(mixed_tuple) # ('太郎', 25, True, 3.14)
括弧なしでも作成可能
# 括弧がなくてもタプルとして認識される
coordinates = 10, 20
print(coordinates) # (10, 20)
print(type(coordinates)) # <class 'tuple'>
# ただし、読みやすさのため括弧をつけることが推奨される
coordinates = (10, 20)
要素が1つだけのタプル
# 間違い:これは数値になってしまう
not_tuple = (42)
print(type(not_tuple)) # <class 'int'>
# 正しい:カンマを付けてタプルにする
one_element_tuple = (42,)
print(type(one_element_tuple)) # <class 'tuple'>
# または括弧なしでも可能
one_element_tuple = 42,
print(type(one_element_tuple)) # <class 'tuple'>
タプルとリストの違い
タプルとリストの主な違いを詳しく見てみましょう。
変更可能性の違い
# リスト:変更可能(ミュータブル)
my_list = [1, 2, 3]
my_list[0] = 100 # OK
my_list.append(4) # OK
print(my_list) # [100, 2, 3, 4]
# タプル:変更不可(イミュータブル)
my_tuple = (1, 2, 3)
# my_tuple[0] = 100 # TypeError: 'tuple' object does not support item assignment
# my_tuple.append(4) # AttributeError: 'tuple' object has no attribute 'append'
print(my_tuple) # (1, 2, 3) ← 変更されない
記法の違い
# リスト:角括弧 []
my_list = [1, 2, 3]
# タプル:丸括弧 ()
my_tuple = (1, 2, 3)
性能の違い
import sys
import time
# メモリ使用量の比較
list_data = [1, 2, 3, 4, 5]
tuple_data = (1, 2, 3, 4, 5)
print(f"リストのメモリ使用量: {sys.getsizeof(list_data)} bytes")
print(f"タプルのメモリ使用量: {sys.getsizeof(tuple_data)} bytes")
# タプルの方が少ないメモリを使用
# 実行速度の比較(作成時間)
start = time.time()
for _ in range(1000000):
[1, 2, 3, 4, 5]
list_time = time.time() - start
start = time.time()
for _ in range(1000000):
(1, 2, 3, 4, 5)
tuple_time = time.time() - start
print(f"リスト作成時間: {list_time:.4f}秒")
print(f"タプル作成時間: {tuple_time:.4f}秒")
# タプルの方が高速
特徴比較表
特徴 | リスト(list) | タプル(tuple) |
---|---|---|
記号 | [] | () |
変更可能性 | 可能(ミュータブル) | 不可能(イミュータブル) |
主な用途 | 動的なデータ操作 | 固定データの保持 |
メモリ使用量 | やや多い | 少ない |
実行速度 | やや遅い | 速い |
辞書のキー | 使用不可 | 使用可能 |
タプルの要素にアクセスする方法

タプルの要素へのアクセス方法はリストとほぼ同じです。
基本的なアクセス
fruits = ("りんご", "バナナ", "みかん", "ぶどう")
# インデックスでアクセス
print(fruits[0]) # りんご(0番目)
print(fruits[1]) # バナナ(1番目)
print(fruits[-1]) # ぶどう(最後の要素)
print(fruits[-2]) # みかん(後ろから2番目)
# スライスでアクセス
print(fruits[1:3]) # ('バナナ', 'みかん')
print(fruits[:2]) # ('りんご', 'バナナ')
print(fruits[2:]) # ('みかん', 'ぶどう')
長さと要素の確認
fruits = ("りんご", "バナナ", "みかん")
# 長さを取得
print(len(fruits)) # 3
# 要素が含まれているかチェック
print("バナナ" in fruits) # True
print("メロン" in fruits) # False
# 要素の個数をカウント
numbers = (1, 2, 3, 2, 2, 4)
print(numbers.count(2)) # 3
# 要素のインデックスを取得
print(numbers.index(3)) # 2
タプルのメリットと使いどころ
データの安全性が高い
# 座標データなど、変更されては困るデータ
ORIGIN_POINT = (0, 0)
SCREEN_SIZE = (1920, 1080)
# これらの値は間違って変更される心配がない
# ORIGIN_POINT[0] = 10 # エラーになるので安全
辞書のキーとして使用可能
# 座標をキーとした辞書
game_board = {
(0, 0): "スタート",
(1, 1): "宝箱",
(2, 3): "敵",
(5, 5): "ゴール"
}
print(game_board[(1, 1)]) # 宝箱
# リストはキーにできない(エラーになる)
# bad_dict = {[0, 0]: "データ"} # TypeError
関数の戻り値として複数の値を返す
def calculate_circle(radius):
"""円の面積と周囲の長さを計算"""
import math
area = math.pi * radius * radius
circumference = 2 * math.pi * radius
return area, circumference # タプルで返す
# 戻り値を受け取る
area, circumference = calculate_circle(5)
print(f"面積: {area:.2f}")
print(f"周囲: {circumference:.2f}")
# タプルとしてまとめて受け取ることも可能
result = calculate_circle(3)
print(f"結果: {result}") # 結果: (28.27, 18.85)
データベースのレコード表現
# 学生の情報をタプルで表現
students = [
("太郎", 20, "工学部"),
("花子", 19, "文学部"),
("次郎", 21, "理学部")
]
for name, age, department in students:
print(f"{name}さん({age}歳)- {department}")
# 太郎さん(20歳)- 工学部
# 花子さん(19歳)- 文学部
# 次郎さん(21歳)- 理学部
タプルの便利な操作と活用テクニック

タプルのアンパック(分解)
# 基本的なアンパック
point = (10, 20)
x, y = point
print(f"x座標: {x}, y座標: {y}") # x座標: 10, y座標: 20
# 複数の変数に一度に代入
person = ("田中太郎", 25, "エンジニア")
name, age, job = person
print(f"{name}は{age}歳の{job}です")
# 一部だけ取得(アンダースコアで不要な値を無視)
data = ("重要なデータ", "不要1", "不要2", "また重要")
important1, _, _, important2 = data
print(f"重要なデータ: {important1}, {important2}")
変数の値の交換
# タプルを使った簡潔な値の交換
a = 10
b = 20
print(f"交換前: a={a}, b={b}")
# pythonならではの美しい書き方
a, b = b, a
print(f"交換後: a={a}, b={b}")
# 3つ以上の変数も同様に
x, y, z = 1, 2, 3
x, y, z = z, x, y # 回転させる
print(f"x={x}, y={y}, z={z}") # x=3, y=1, z=2
enumerate()との組み合わせ
fruits = ["りんご", "バナナ", "みかん"]
# インデックスと値を同時に取得
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# 1から始まるインデックス
for index, fruit in enumerate(fruits, 1):
print(f"{index}番目: {fruit}")
# 1番目: りんご
# 2番目: バナナ
# 3番目: みかん
zip()で複数のシーケンスを組み合わせ
names = ["太郎", "花子", "次郎"]
ages = [25, 22, 28]
cities = ["東京", "大阪", "福岡"]
# 3つのリストを組み合わせて処理
for name, age, city in zip(names, ages, cities):
print(f"{name}({age}歳)は{city}在住")
# 太郎(25歳)は東京在住
# 花子(22歳)は大阪在住
# 次郎(28歳)は福岡在住
# 辞書を作成
person_dict = dict(zip(names, ages))
print(person_dict) # {'太郎': 25, '花子': 22, '次郎': 28}
ネストされたタプル
# 行列をタプルで表現
matrix = (
(1, 2, 3),
(4, 5, 6),
(7, 8, 9)
)
# 要素にアクセス
print(matrix[0][1]) # 2(0行目の1列目)
print(matrix[1][2]) # 6(1行目の2列目)
# 全要素を表示
for row in matrix:
for cell in row:
print(cell, end=" ")
print() # 改行
# 1 2 3
# 4 5 6
# 7 8 9
タプル使用時の注意点

変更が必要になった場合の対処法
# タプルを一時的にリストに変換して変更
original_tuple = (1, 2, 3, 4, 5)
print("元のタプル:", original_tuple)
# リストに変換
temp_list = list(original_tuple)
temp_list[2] = 100 # 変更
temp_list.append(6) # 追加
# タプルに戻す
modified_tuple = tuple(temp_list)
print("変更後のタプル:", modified_tuple) # (1, 2, 100, 4, 5, 6)
ミュータブルな要素を含む場合の注意
# タプルの中にリストがある場合
mixed_tuple = ([1, 2, 3], "文字列", 42)
# タプル自体は変更できないが...
# mixed_tuple[0] = [4, 5, 6] # エラー
# 中のリストは変更できてしまう
mixed_tuple[0].append(4)
print(mixed_tuple) # ([1, 2, 3, 4], '文字列', 42)
# より安全にするなら、中身もイミュータブルにする
safe_tuple = ((1, 2, 3), "文字列", 42) # 内側もタプル
空のタプルと単一要素タプル
# 空のタプル
empty_tuple = ()
print(len(empty_tuple)) # 0
# または
empty_tuple = tuple()
print(len(empty_tuple)) # 0
# 単一要素のタプル(カンマを忘れずに)
single_tuple = (42,)
print(len(single_tuple)) # 1
# カンマを忘れると数値になってしまう
not_tuple = (42)
print(type(not_tuple)) # <class 'int'>
実践的な使用例

設定値の管理
# アプリケーションの設定をタプルで管理
DATABASE_CONFIG = (
"localhost", # ホスト
5432, # ポート
"myapp", # データベース名
"utf8" # エンコーディング
)
def connect_database():
host, port, db_name, encoding = DATABASE_CONFIG
print(f"接続先: {host}:{port}")
print(f"データベース: {db_name}")
print(f"エンコーディング: {encoding}")
connect_database()
RGB色の管理
# 色をタプルで定義
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
def create_color_info(color_tuple):
"""色の情報を作成"""
r, g, b = color_tuple
return f"RGB({r}, {g}, {b})"
print(create_color_info(RED)) # RGB(255, 0, 0)
print(create_color_info(GREEN)) # RGB(0, 255, 0)
# 色のパレット
PALETTE = (RED, GREEN, BLUE, WHITE, BLACK)
for i, color in enumerate(PALETTE):
print(f"色{i}: {create_color_info(color)}")
座標系での計算
def distance(point1, point2):
"""2点間の距離を計算"""
x1, y1 = point1
x2, y2 = point2
return ((x2 - x1) ** 2 + (y2 - y1) ** 2) ** 0.5
def midpoint(point1, point2):
"""2点の中点を計算"""
x1, y1 = point1
x2, y2 = point2
return ((x1 + x2) / 2, (y1 + y2) / 2)
# 使用例
start = (0, 0)
end = (3, 4)
print(f"距離: {distance(start, end)}") # 距離: 5.0
print(f"中点: {midpoint(start, end)}") # 中点: (1.5, 2.0)
# 複数の点での処理
points = [(0, 0), (1, 1), (2, 2), (3, 3)]
for i in range(len(points) - 1):
dist = distance(points[i], points[i + 1])
print(f"{points[i]} → {points[i + 1]}: {dist:.2f}")
データベースのような構造
# 商品情報をタプルで管理
products = [
("P001", "ノートPC", 98000, "電子機器"),
("P002", "マウス", 2500, "周辺機器"),
("P003", "キーボード", 8500, "周辺機器"),
("P004", "モニター", 35000, "電子機器")
]
def search_by_category(products, category):
"""カテゴリで商品を検索"""
result = []
for product_id, name, price, cat in products:
if cat == category:
result.append((product_id, name, price))
return result
def format_price(price):
"""価格をフォーマット"""
return f"¥{price:,}"
# カテゴリ別に商品を表示
categories = ["電子機器", "周辺機器"]
for category in categories:
print(f"\n{category}:")
found_products = search_by_category(products, category)
for product_id, name, price in found_products:
print(f" {product_id}: {name} - {format_price(price)}")
よくある疑問
- Qタプルとリスト、どちらを使えば良い?
- A
データを変更する予定があるならリスト、変更しないならタプルを使いましょう。迷った時はリストでも問題ありません。
- Qタプルの要素を部分的に変更したい場合は?
- A
一度リストに変換してから変更し、再度タプルに戻すか、新しいタプルを作成します。
# 方法1:リスト経由 old_tuple = (1, 2, 3, 4) temp_list = list(old_tuple) temp_list[2] = 100 new_tuple = tuple(temp_list) # 方法2:新しいタプルを作成 old_tuple = (1, 2, 3, 4) new_tuple = old_tuple[:2] + (100,) + old_tuple[3:]
- Qタプルの中にタプルを入れることはできる?
- A
はい、ネストしたタプルを作ることができます。
nested = ((1, 2), (3, 4), (5, 6)) print(nested[0][1]) # 2
- Qタプルはいつ使われることが多い?
- A
関数の戻り値、辞書のキー、設定値、座標データなどでよく使われます。
- Qパフォーマンスを重視するならタプル?
- A
固定データならタプルの方が高速でメモリ効率も良いですが、実際の差は小さいことが多いです。可読性や保守性を優先しましょう。
まとめ
pythonのタプルは、安全で効率的なデータ管理を可能にする重要なデータ型です。
今回学んだポイント
- 基本構造:
()
を使った変更不可能なデータ構造 - リストとの違い:変更可能性、性能、用途の違い
- 主な用途:固定データ、関数戻り値、辞書キー、座標データ
- 便利な機能:アンパック、変数交換、enumerate、zip
- 注意点:ミュータブル要素の扱い、単一要素タプルの作成方法
コメント