Python | データ構造:tuple

Python
スポンサーリンク

タプルの概要(順序があり、変更できない「箱」)

Pythonのタプルは、複数の値を順序付きでまとめる不変(イミュータブル)なデータ構造です。小括弧 () で作り、一度作成したら中身を追加・削除・変更できません。整数・文字列・他のタプルやリストなど、型は混在可能です。設定値や座標、関数の戻り値のまとまりなど「途中で変わっては困るデータ」に向いています。

empty = ()
nums  = (1, 2, 3)
mix   = ("apple", 123, 3.14, True)
print(type(nums))  # <class 'tuple'>
Python

作り方と単一要素の注意(ここが重要)

小括弧あり・なしで作成できる

値をカンマで区切れば、実は小括弧を省略してもタプルになります。読みやすさのために基本は () を付けるのがおすすめです。

t1 = (10, 20, 30)
t2 = 10, 20, 30  # これもタプル
Python

単一要素は「カンマが必須」

要素が1つだけのタプルを作るときは末尾のカンマが必要です。小括弧だけでは単なる括弧付きの値になります。

t_ok  = (5,)   # 1要素のタプル
t_ng  = (5)    # これは整数 5(タプルではない)
Python

タプル化とアンパック

既存のシーケンスは tuple(…) でタプルに変換できます。逆にタプルは「アンパック」で手軽に分解できます。

tpl = tuple([1, 2, 3])   # リスト→タプル
a, b, c = tpl            # アンパック
print(a, b, c)           # 1 2 3
Python

アクセス・スライス・走査(使い方の基本)

インデックスで参照する

タプルはリストと同様に 0 始まりのインデックスで要素にアクセスできます。負のインデックスは末尾から。

colors = ("red", "green", "blue")
print(colors[0])   # "red"
print(colors[-1])  # "blue"
Python

スライスで部分抽出

半開区間のスライスで部分範囲を取り出せます。結果は新しいタプルです。

nums = (0, 1, 2, 3, 4, 5)
print(nums[1:4])   # (1, 2, 3)
print(nums[::2])   # (0, 2, 4)
print(nums[::-1])  # 逆順コピー
Python

反復処理と内包的な生成

for で順に処理できます。新しいタプルを作るときは tuple(…) で包むのが自然です。

for x in ("A", "B", "C"):
    print(x)

squares = tuple(n*n for n in range(5))
print(squares)  # (0, 1, 4, 9, 16)
Python

不変であることの意味(重要ポイントを深掘り)

「変更できない」から安全で予測可能

タプルは後から append/remove/insert/sort などができません。参照渡しでも中身が変わらないため、関数間の受け渡しや辞書キーとして安心して使えます。

key = (10, 20)
d = {}
d[key] = "point"  # タプルは辞書のキーにできる
Python

「中のオブジェクト」は変わりうる場合がある

不変なのは「タプルが持つ参照」です。もし中にミュータブル(例:リスト)が入っていると、その中身は変更可能です。設計時に混在を避けるか、用途に応じて使い分けましょう。

t = (1, [2, 3])
t[1].append(4)
print(t)  # (1, [2, 3, 4])  ← タプル自体は同じだが中のリストは変わる
Python

置き換えが必要なら「新しいタプルを作る」

要素の差し替えや追加をしたい場合は、元を使って再構築します。足し算で連結も可能です。

t = (1, 2, 3)
t = t[:1] + (99,) + t[2:]   # 2を99に置換した新タプル
print(t)  # (1, 99, 3)
Python

実用パターン(関数戻り値・座標・固定レコード)

関数から複数値を返す

複数の結果をひとまとめにして返し、呼び出し側でアンパックします。読みやすく安全です。

def stats(nums):
    return (len(nums), sum(nums), min(nums), max(nums))

n, total, mn, mx = stats([10, 20, 5])
print(n, total, mn, mx)  # 3 35 5 20
Python

座標・色などの固定長データ

x,y 座標や RGB 値など、固定長で意味が定まっているデータはタプルが向いています。

point = (12.3, -4.5)
color = (128, 64, 0)
Python

辞書キー・セット要素にする

変更されないまとまりとしてキーや集合要素に使えます。リストはキーになれませんがタプルなら可能です。

visited = set()
visited.add((1, 2))  # 座標を集合管理
Python

タプル特有の便利な書き方(交換・可変長アンパック)

変数の値を一行で交換

並べ替えが直感的で安全です。

a, b = 1, 2
a, b = b, a
print(a, b)  # 2 1
Python

可変長アンパック(“残り全部”を受け取る)

星付きで残りをまとめて受け取れます。先頭・末尾固定+中間可変に便利です。

head, *middle, tail = (1, 2, 3, 4, 5)
print(head, middle, tail)  # 1 [2, 3, 4] 5
Python

例題で身につける(定番から一歩先まで)

例題1:1要素タプルの作成と判定

t = (42,)
print(isinstance(t, tuple), len(t))  # True 1
Python

例題2:複数戻り値のアンパック

def divmod_safe(a, b):
    if b == 0:
        return (None, None)
    return (a // b, a % b)

q, r = divmod_safe(10, 3)
print(q, r)  # 3 1
Python

例題3:辞書キーとしての利用

prices = {("coffee", 350): "hot", ("tea", 280): "ice"}
print(prices[("tea", 280)])  # "ice"
Python

例題4:固定レコードの検証と変換

row = ("coffee", 350, 2)
name, price, qty = row
print(f"{name} x{qty} ¥{price}")
Python

落とし穴とベストプラクティス(初心者がつまずきやすい点)

単一要素にカンマを忘れる

(5,) のカンマを忘れるとタプルではなく整数になります。型が違ってバグになりがちなので注意しましょう。

中にミュータブルを入れると“実質”変わりうる

不変性を期待する場面では、タプルの中身もイミュータブルに揃えるのが安全です。どうしても必要なら「変更が起きる可能性」を前提に設計します。

“変更したい”ならリストを選ぶ

後から追加・削除・並べ替えが必要なデータは、はじめからリストで持つほうが自然です。タプルは「変わらない保証」が価値になります。


まとめ

タプルは「順序付きだが変更できない」まとまりを表す基本構造です。小括弧とカンマで作り、単一要素ではカンマが必須。インデックスやスライスで参照し、変更が必要なときは新しいタプルを再構築します。関数の複数戻り値、座標や設定など“変わらないまとまり”、辞書キー・集合要素としての利用に強みがあります。中のミュータブルが変わりうる点と、変更が必要ならリストを選ぶ使い分けを押さえれば、初心者でも安全で読みやすいデータ設計ができるようになります。

タイトルとURLをコピーしました