タプルはリストと同じく「複数の変数を1個の値として使うために、まとめる」機能です。
ここでは「タプルって何?」「タプルはどうやって使うの?」「タプルとリストの違いは何?」といった疑問に答えつつ、タプルについての理解を深めていきましょう。
また、タプルはリストととても似ているので、リストの場合と比較しながら見ていくと、より理解度が深まるのでおすすめです。
YouTubeも公開していますので、動画や音声で聞きたい方はぜひご覧ください。
タプルの初期化
まずは基本的なタプルの初期化方法を見ていきましょう。
リストの場合は[]で初期化しましたが、タプルは()を使います。
[構文]
(値1, 値2, 値3, …)
では実際にタプルを作ってみましょう。
tuple = (2, 5, 2, 1, 6)
print(tuple)
[出力結果]
(2, 5, 2, 1, 6)
リストの場合は[]で括られていましたが、タプルだと()で括られているのがわかります。また、タプルはカッコを省略しても問題ありません。
tuple = 2, 5, 2, 1, 6 # 結果は同じ
print(tuple)
使いやすい方で構いませんが、基本的にはカッコを付けて定義する慣習があります。
タプルはリストと同じく、型が混在しても問題ありません。
tuple = (2, "Hello", 2, True, 5.5)
print(tuple)
タプルとリストの違い
ここまではタプルもリストも、カッコの種類が違うだけであとは全て同じでしたね。
ではタプルとリストは何が違うのでしょうか?
それは、リストが値の追加や削除、更新ができるのに対し(この特性をミュータブルと言います)、タプルは初期化後に変更ができない点です(ミュータブルの反対で、イミュータブルと言います)。
この特性のおかげでタプルは辞書のキーとしてそのまま使うことができ「複合したキーでユニークにした辞書を使いたい」ときに役立ちます。
#タプルを使わない場合は複数のキーをデリミタ(_)で繋げて使う必要があります。
user_id = "10"
item_id = "12345"
key = user_id + "_" + item_id
dict = {key : "item_name"}
print(dict)
tuple = ("10", "12345")
tuple_dict = {tuple : "item_name"}
print(tuple_dict)
[出力結果]
{'10_12345': 'item_name'}
{('10', '12345'): 'item_name'}
タプルは辞書のキーにそのまま使えるので、上述したプログラムのようなことが可能です。
ちなみにリストで同じことをしようとするとエラーになります。
#タプルの箇所をリストにするとエラーになります。
list = ["10", "12345"]
dict = {list : "item_name"}
print(dict)
[出力結果]
TypeError: unhashable type: 'list'
タプルの内容を変更する方法
タプルはイミュータブルなので、タプル内の要素の追加・削除・変更ができないのは先述した通りです。
ですが、内容を変更する方法が2つあります。
①変数ごと上書きする
一度作ったタプルの「要素」は変更できませんが「変数そのもの」は上書きできます。
つまり、タプルは変数であり、定数ではないということです。
tuple1 = (1, 2, 3)
print("変更前→{0}".format(tuple1))
tuple2 = (4, 5)
tuple1 = tuple2
print("変更後→{0}".format(tuple1))
[出力結果]
変更前→(1, 2, 3)
変更後→(4, 5)
②タプル同士で連結する
タプルはタプル同士で連結して要素を追加できます。
タプルの連結は文字列と同じく「+(プラス)」を使います。
tuple1 = (1, 2, 3)
tuple2 = (4, 5)
tuple3 = tuple1 + tuple2
print(tuple3)
[出力結果]
(1, 2, 3, 4, 5)
また、タプルの連結でも複合代入演算子(+=)が使えます。
複合代入演算子について、詳しく知りたい方は以下の記事をご覧ください。
タプルの参照
ではここからタプルの使い方を見ていきましょう。
まずは単純にタプルから値を取り出してみましょう。
タプルから値を取り出すのはリストと同じく「割り当てられたインデックス番号を使ってアクセス」します。
先ほどのコードから「Hello」の文字列を参照してみましょう。
tuple = (2, "Hello", 2, True, 5.5)
hello = tuple[1]
print(hello)
[出力結果]
Hello
また、タプル内の全ての要素を順番に取得する場合も、リストと同じくfor文を使うことで実現できます。
tuple = (2, "Hello", 2, True, 5.5)
for item in tuple:
print(item)
[出力結果]
2
Hello
2
True
5.5
タプルのアンパック
タプルの便利な使い方に「アンパック」という機能があります。
アンパックは文章で説明するより、実際にコードで見た方が理解が早いでしょう。次のコードを見てください。
(x, y) = (5, -3)
print(x)
print(y)
[出力結果]
5
-3
タプルを代入する変数側もタプル形式にすることで、xとyそれぞれに5と-3が代入されています。
この方法を使うと「関数やメソッドからの戻り値を複数受け取ることができます」。
カッコを省略すると、複数の変数への代入を1行でやっているような印象を受けます。
x, y = 5, -3
print(x)
print(y)
タプルを比較する
最後に2つのタプルの比較方法を見てみましょう。
リストと同じく、タプルの比較をする場合も値の比較かオブジェクトの比較かを意識する必要があります。
値の比較には「==」を、オブジェクトの比較には「is」を使います。
次のプログラムを見てください。
tuple1 = (1, 2)
tuple2 = (1, 2) #tuple1と「同じ要素」のタプル
tuple3 = (1, 3) #tuple1と「異なる要素」のタプル
tuple4 = tuple1 #tuple1と「同じオブジェクト」のタプル
print(tuple1 == tuple2) #True
print(tuple1 is tuple2) #False
print(tuple1 == tuple3) #False
print(tuple1 == tuple4) #True
print(tuple1 is tuple4) #True
[出力結果]
True
False
False
True
True
tuple1を基軸に、比較用のタプルを複数初期化しています。
tuple2はtuple1と同じ要素なので「==」ではTrueになりますが、別に作成したタプルなので「is」の場合はFalseになります。
tuple3はtuple1と値が異なるので「==」でもFalseになります。
tuple4はtuple1の参照を代入しています(つまり同じオブジェクトの住所を持っています)。
Pythonの場合は同じタプルを参照している場合は同じ値とみなしTrueになります。
また、同じタプルを参照しているので、「is」での比較は当然Trueとなります。