Pythonのタプルはリストと同じく「複数の変数を1個の値として使えるようにまとめる」機能です。
リストがあればほとんどケースで事足りますが、タプルの方が良い時もあります。
ここではタプルについて
- Pythonのタプルって?
- Pythonのタプルの基本的な構文、初期化方法は?
- Pythonのタプルとリストの違いは?
- Pythonのタプルが輝くときはどんな時?
といった疑問に答えつつ、タプルについて解説していきます。
目次
Pythonのタプル(tuple)の初期化
タプルの使い方を解説していきましょう。
まずはタプルの初期化方法を見ていきます。
基本的なタプルの初期化
タプルの基本的な初期化方法はリストとほぼ同じですが、括弧が異なります。
タプルを初期化するには次にようにします。
書式 変数 = (要素1, 要素2, 要素3, ... 要素n)
実際にタプルを初期化したのが次のコードです。
numbers = (3, 14, 15, 92, 65, 35)
strings = ("なまむぎ", "なまごめ", "なまたまご")
print(numbers)
print(strings)
結果
(3, 14, 15, 92, 65, 35)
('なまむぎ', 'なまごめ', 'なまたまご')
リストの場合は結果がカギカッコだったのに対し、タプルの場合は丸カッコになっていますが、それ以外は全て同じです。
また、タプルの場合は丸カッコを省略できます。
numbers = 3, 14, 15, 92, 65, 35
print(numbers)
結果
(3, 14, 15, 92, 65, 35)
結果に丸カッコが付いているので、ちゃんとタプルで初期化されています。
ちなみに要素が一つしかないタプルを作る場合は、要素の後にカンマをつけます。
number = 3,
print(number)
結果
(3,)
ちょっと不恰好な気がしないでもないですが許容範囲でしょう。
tuple()を使った初期化
次にtuple()を使ってタプルを初期化する方法を見ていきましょう。tuple()をうまく使えば効率よく初期化でき、ソースコードもスッキリするかもしれません。
連続番号を持ったタプルを作成したい場合はrange()を引数にすることで作成できます。
range_tuple = tuple(range(-3, 4))
print(range_tuple)
結果
(-3, -2, -1, 0, 1, 2, 3)
あとは文字列を渡すと一文字ずつに分解してタプルにしてくれます。ここら辺の連番や文字列の分解はlist()と同じです。
aomaki = "あおまきがみあかまきがみきまきがみ"
chars = tuple(aomaki)
print(chars)
('あ', 'お', 'ま', 'き', 'が', 'み', 'あ', 'か', 'ま', 'き', 'が', 'み', 'き', 'ま', 'き', 'が', 'み')
また、tuple()を使うとリストをタプルに変換することもできます(逆にlist()を使うとタプルをリストにできます)。
list = [1, 2, 3]
convert_tuple = tuple(list)
print(convert_tuple)
(1, 2, 3)
Pythonのタプル(tuple)の使い方
次に初期化したタプルの使い方を見ていきましょう。
要素の参照
要素の参照はリストと同じくインデックス番号を使います。
mixes = (3, "こんにちは", True, 0.314)
hello = mixes[1]
print(hello)
こんにちは
タプル内の要素を全て取り出したい場合もリストと同じくfor..inを使います。
mixes = (3, "こんにちは", True, 0.314)
for mix in mixes:
print(mix)
3
こんにちは
True
0.314
タプルのアンパック
タプル(5, -3)を変数(x, y)に代入するといったことができます。これをタプルのアンパックと言います。
(x, y) = (5, -3)
print(x)
print(y)
5
-3
これも両方ともカッコを省略することができます。
x, y = 5, -3
print(x)
print(y)
カッコを省略すると「1行で複数の変数に代入している」ように見えます。これはこれで便利ですし、あとは関数やメソッドの戻り値がタプルだった場合に有用です。
def grid_calc():
return (5, -3) #タプルを返す関数
x, y = grid_calc() #戻り値をx, yで受け取る
print(x)
print(y)
Pythonのタプルとリストの違い
基本的な初期化方法をざっと見たところで、次にタプルとリストの違いを見ていきましょう。
タプルとリストの違いは「要素の変更ができない」点です。変更しようとするとエラーになります。
mixes = (3, "こんにちは", True, 0.314)
mixes[2] = False
print(mixes)
TypeError: 'tuple' object does not support item assignment
※タプルは要素を変えることはできませんが「タプルそのものを変えることは可能です」。つまり別のタプルで再度初期化することはできてしまうので、「一度作ったタプルは絶対に変更できない訳ではない」点は注意が必要です。
mixes = (3, "こんにちは", True, 0.314)
mixes = (3, "こんにちは", False, 0.314)
print(mixes)
(3, 'こんにちは', False, 0.314)
さらに、「タプルの中にリストがある場合は、そのリストの要素は変更可能」です。
lists_tuple = ([1, 2], [3, 4], [5, 6])
lists_tuple[1][0] = 10 #タプルの中のリストの要素を変える
print(lists_tuple)
([1, 2], [10, 4], [5, 6])
タプルはあくまで「タプルが持つ要素の変更が不可」という点が重要です。
Pythonのタプルの使いどころについて
ぱっと見たところ、タプルはリストよりも使い勝手に欠ける「あまり使えない」印象を受けがちですが、見方を変えるとタプルの方が良い場合や、タプルじゃないとダメなこともあります。一つずつ見ていきましょう。
変更を許可しない変数を作るとき
タプルは要素の変更ができないので「変更されたくない・変更してはいけない変数を作る場合」に役立ちます。
コードを書いてるうちに変更してはいけない変数を変えてしまった…というのはよくある話で、バグの温床になりがちです(変数の有効範囲はできるだけ小さくするのが鉄則)。
タプルを使用することで間違えて変数を変えてしまうというミスを「極力」減らすことができます。
辞書のキーに使える
辞書のキーには変更不可(イミュータブルと言います)な値しか設定できないのでリストは使えませんが、タプルなら使うことができます。
p = (5, -3)
q = (8, 4)
r = (-7, 1)
dict = {p : "点P", q : "点Q", r : "点R"}
print(dict[p])
print(dict[r])
点P
点R
上のコードはタプルを辞書のキーにし、同じくタプルを使って辞書内の要素にアクセスしています。
このように「複数の要素をキーにしたい」場合はタプルを使うと便利です。
Pythonでどうしてもタプルの要素を変更したいときは?
基本的にタプルはタプル内の要素を変更したくない場合に使うので、タプルを初期化した後に要素を変更するのはNGです。
しかし、プログラム上どうしても要素を変更したい場合も出てくるかもしれません。そういったときにどう変更するのかを見ていきましょう。
新しいタプルを作って再代入する
一番直感的に分かりやすい方法です。
とりあえず再代入しちゃえば追加も更新も削除もできます。
numbers = (3, 66, 29, 9, 34)
print(numbers)
numbers = (66, 29, 34)
print(numbers)
numbers = ()
print(numbers)
(3, 66, 29, 9, 34)
(66, 29, 34)
()
タプル同士を結合する
要素を追加したい場合はタプル同士を結合することもできます。
numbers = (3, 66, 29)
print(numbers)
numbers += (9, 34)
print(numbers)
(3, 66, 29)
(3, 66, 29, 9, 34)
一度リストに変換する
一度リストにして変更してから再度タプルに直すという方法もあります。
少し手間ですが、要素と要素の間に要素を挿入したい場合や、ピンポイントで要素の変更・削除がしたい場合はこのようにリストを経由しましょう。
chars = ("a", "b", "d", "e")
list_chars = list(chars)
list_chars.insert(2, "c") #bとdの間にcを挿入
list_chars.pop(0) #aを削除
tuple_chars = tuple(list_chars)
print(tuple_chars)
('b', 'c', 'd', 'e')