Q1次のうちタプルとして正しく宣言できているのはどれですか?
タプル型 (tuple) の使い方
Python のタプル型 tuple の使い方を、リストとの違いを軸に解説します。宣言からアンパック、辞書のキーとして使える理由まで図解で押さえます。
タプルとは — リストの「変えられない版」
タプル (tuple) は、複数の値を 1 つの変数にまとめて持たせる型です。前章で扱ったリストとよく似ていますが、最大の違いは 「一度作ったら中身を変えられない」 という点です。
リストが買い物リストのように書き換える前提の入れ物なら、タプルは座標 (x, y) や RGB (255, 0, 0) のように最初に決めたら動かさない入れ物です。
括弧の種類と変更可否が違うだけで、複数の値をまとめる役割は同じです。
書き換えるならリスト、固定ならタプル と覚えるとシンプルです。
宣言は ( と ) で囲み、カンマで区切るだけです。リストの [ ] がタプルでは ( ) です。
要素の取り出し方(インデックス、スライス)はリストとまったく同じで、[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 のように括弧を省略してもタプルになる仕様にですが、可読性のため、( ) を付けましょう。
イミュータブル — 「要素の書き換え」と「箱の入れ替え」は別
タプルはイミュータブル(変更不可能)な型です。一度作ったタプルの要素を上書き・追加・削除することはできません。
ここでよく混乱するのが、「要素を変える」と「変数全体に新しいタプルを入れ直す」の違いです。前者は NG、後者は OK です。
t[0] = 9 は中身を直接書き換えようとするので エラー。
t = (4, 5, 6) は 新しいタプルに変数を付け替えるだけなので OK。
連結とメソッド (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(...) で戻す のが定番パターンです。
アンパックと辞書のキー — タプルならではの使い道
タプルにはリストにはないタプルだけにの機能が 2 つあります。アンパックと辞書のキーです。
左辺にカンマ区切りで変数名を並べると、タプルの各要素がそのまま別々の変数に入ります。
位置の対応は順番通りで、変数の数と要素数は一致させる必要があります。
# アンパック
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 つの変数に分かれます。関数の章は後半で扱うのでここでは深入りしませんが、「複数戻り値とアンパックはセット」だと覚えておくと、後でスムーズに理解できます。
もう 1 つの強みが辞書のキーに使えることです。リストは辞書のキーにできませんが、タプルは OK です。座標 → 国名のような、「複数の値の組み合わせ」を 1 つのキーにしたいときに重宝します。
# 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'
この記事では、リストとの違いを軸に、タプルの宣言、イミュータブルの意味、連結と count / index、アンパックと辞書のキーを学びました。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2t = (1, 2, 3) のとき、エラーにならないのはどれですか?
Q3coord = (135.0, 35.0) を 2 つの変数 lng, lat に分けて取り出す書き方として、最もシンプルなのはどれですか?