順番に読み進めながら学べます

タプル型 (tuple) の使い方

Python のタプル型 tuple の使い方を、リストとの違いを軸に解説します。宣言からアンパック、辞書のキーとして使える理由まで図解で押さえます。

タプルとは — リストの「変えられない版」

タプル (tuple) は、複数の値を 1 つの変数にまとめて持たせる型です。前章で扱ったリストとよく似ていますが、最大の違いは 「一度作ったら中身を変えられない」 という点です。

リストが買い物リストのように書き換える前提の入れ物なら、タプルは座標 (x, y) や RGB (255, 0, 0) のように最初に決めたら動かさない入れ物です。

リストとタプルの違い
リスト[1, 2, 3]変更可タプル(1, 2, 3)変更不可宣言特徴宣言特徴

括弧の種類変更可否が違うだけで、複数の値をまとめる役割は同じです。

書き換えるならリスト、固定ならタプル と覚えるとシンプルです。

宣言は ( と ) で囲み、カンマで区切るだけです。リストの [ ] がタプルでは ( ) です。

要素の取り出し方(インデックス、スライス)はリストとまったく同じで、[0] で先頭、[-1] で末尾、[1:3] で部分列を取れます。

# タプルの宣言
fruits = ("apple", "banana", "lemon")

print(fruits)        # ('apple', 'banana', 'lemon')
print(type(fruits))  # <class 'tuple'>
print(fruits[0])     # apple
print(fruits[-1])    # lemon
print(fruits[1:])    # ('banana', 'lemon')  ← 取り出した結果も tuple

# 違う型を混ぜても OK
profile = ("Alice", 28, 165.5)

要素 1 つのタプルは末尾にカンマが必要

fruits = ("apple") と宣言すると、これは タプルではなく文字列になります。( ) は数式の括弧と同じ意味でも使われるため、Python は「中身が 1 つだけ」のときに区別ができません。

要素 1 つのタプルにしたいときは ("apple",) のように末尾にカンマを付けてください。

また、Python では 1, 2, 3 のように括弧を省略してもタプルになる仕様にですが、可読性のため、( ) を付けましょう。

タプルを宣言して中身を取り出してみましょう。

colors = ("red", "green", "blue") を作り、先頭末尾の色をそれぞれ print() で表示してください。

colors[0:2]print() で表示し、スライスの結果も tuple であることを type() で確認してください。

(正しく実行できれば解説が表示されます)

Python エディタ

コードを実行してください

イミュータブル — 「要素の書き換え」と「箱の入れ替え」は別

タプルはイミュータブル(変更不可能)な型です。一度作ったタプルの要素を上書き・追加・削除することはできません

ここでよく混乱するのが、「要素を変える」と「変数全体に新しいタプルを入れ直す」の違いです。前者は NG、後者は OK です。

「要素の書き換え」 vs 「箱の入れ替え」
t = (1,2,3)t[0] = 9TypeErrort = (1,2,3)t = (4,5,6)新しい箱に入替要素失敗再代入成功

t[0] = 9 は中身を直接書き換えようとするので エラー

t = (4, 5, 6)新しいタプルに変数を付け替えるだけなので OK。

タプルの要素を書き換えようとすると、本当にエラーが出るのかを確かめてみましょう。

① 下のコードをそのまま実行してください。TypeError が表示されるはずです。

② エラーを確認したら、my_tuple[0] = 9 の行をコメントアウト(行頭に # を付ける)し、代わりに my_tuple = (9, 2, 3) を書いて、print(my_tuple) で結果を確認してください。こちらはエラーになりません

Python エディタ

コードを実行してください

連結とメソッド (count / index)

結合して、新しいタプルを作成することはできます。+ で別のタプルをつなぐと、新しいタプルが返ります

メソッドは少なく、よく使うのは count と index の 2 つだけです。リストで習ったものと同じ感覚で使えます。

やりたいこと書き方ポイント
連結t1 + t2新しいタプルを返す。元は変わらない
1 要素を追加t + (x,)末尾のカンマを忘れない
値を数えるt.count(x)x が何個あるかを返す
位置を調べるt.index(x)最初に x が現れる位置を返す
fruits = ("apple", "banana", "lemon")

# 連結(新しいタプルが返る)
more = fruits + ("grape",)
print(more)            # ('apple', 'banana', 'lemon', 'grape')
print(fruits)          # ('apple', 'banana', 'lemon')  ← 元は不変

# count と index
nums = (1, 2, 2, 3, 2, 4)
print(nums.count(2))   # 3(2 が 3 つ)
print(nums.index(3))   # 3(3 は 4 番目 = index 3)

# list ↔ tuple 相互変換
list_fruits  = list(fruits)   # ['apple', 'banana', 'lemon']
tuple_fruits = tuple(list_fruits)  # ('apple', 'banana', 'lemon')

中身を頻繁にいじりたいなら一度 list へ

タプルは「ほぼ動かさない値」のための型です、追加・削除を繰り返したい場面には向きません。そういうときは list(t) でリストに変換 → 編集 → 必要なら tuple(...) で戻す のが定番パターンです。

曜日のタプルから情報を取り出してみましょう。

days = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") が用意されています。

days.index("Fri")"Fri"何番目にあるかを print() で表示してください。

weekend = ("Sat", "Sun") を作り、days + weekend のように連結するとどうなるかを確認したいので、days + weekendprint() で表示してください(同じ要素が重複して入って構いません)。

Python エディタ

コードを実行してください

アンパックと辞書のキー — タプルならではの使い道

タプルにはリストにはないタプルだけにの機能が 2 つあります。アンパック辞書のキーです。

アンパック — 1 行で複数の変数に分解
coord=(135, 35)lng, lat= coordlng=135lat=35代入分解

左辺にカンマ区切りで変数名を並べると、タプルの各要素がそのまま別々の変数に入ります。

位置の対応は順番通りで、変数の数と要素数は一致させる必要があります。

# アンパック
coord = (135.0, 35.0)
longitude, latitude = coord
print(longitude)   # 135.0
print(latitude)    # 35.0

# 直接書いてもよい
r, g, b = (255, 128, 0)
print(r, g, b)     # 255 128 0

# よくある使い方:複数の値を一度に交換
a, b = 1, 2
a, b = b, a
print(a, b)        # 2 1

関数の戻り値もタプルになる(先取り)

Python の関数は return a, b のように複数の値を返すことができ、その際は自動的にタプルとして返ります。受け取る側で x, y = func() と書けば、そのままアンパックされて 2 つの変数に分かれます。関数の章は後半で扱うのでここでは深入りしませんが、「複数戻り値とアンパックはセット」だと覚えておくと、後でスムーズに理解できます。

RGB の色情報をアンパックで取り出してみましょう。

rgb = (200, 100, 50) が用意されています。

① アンパックを使って r, g, b の 3 変数にそれぞれ赤・緑・青の値を取り出してください。

print()r, g, b の値を 1 行ずつ表示してください。

Python エディタ

コードを実行してください

もう 1 つの強みが辞書のキーに使えることです。リストは辞書のキーにできませんが、タプルは OK です。座標 → 国名のような、「複数の値の組み合わせ」を 1 つのキーにしたいときに重宝します。

tuple は dict のキーにできる
(135,35)tupledict のキーにOK[135,35]listdict のキーにTypeError
# tuple をキーにした辞書
country = {
    (135.0, 35.0): "Japan",
    (-77.0, 38.9): "USA",
}
print(country[(135.0, 35.0)])   # Japan
print(country.get((0.0, 0.0), "不明"))   # 不明

# list はキーにできない
# bad = {[135.0, 35.0]: "Japan"}  # TypeError: unhashable type: 'list'

座標と都市名をひも付ける辞書を作りましょう。

① キーが (35.0, 139.0) で値が "Tokyo"、キーが (34.7, 135.5) で値が "Osaka" の辞書 cities を作ってください。

cities[(35.0, 139.0)]print() で表示し、東京が取り出せることを確認してください。

(0.0, 0.0).get() の第 2 引数に "不明" を渡して取り出し、無いキーでも安全に動くことを確認してください。

Python エディタ

コードを実行してください

この記事では、リストとの違いを軸に、タプルの宣言イミュータブルの意味連結と count / indexアンパックと辞書のキーを学びました。

QUIZ

理解度チェック

まずは1問ずつ答えてみましょう。

Q1次のうちタプルとして正しく宣言できているのはどれですか?

Q2t = (1, 2, 3) のとき、エラーにならないのはどれですか?

Q3coord = (135.0, 35.0) を 2 つの変数 lng, lat に分けて取り出す書き方として、最もシンプルなのはどれですか?