この記事では、Pythonのtuple(タプル)の定義や使い方について解説します。
タプル(tuple)
とは、順序付けされた複数の要素を格納できるコレクションの一種でリストと同様によく使用されるデータ型です。特徴としては要素を追加・変更・削除できないことです。
それでは、タプルについて見ていきましょう!
tuple(タプル)とは?
タプルとは、異なる型の要素を格納できるイミュータブルなシーケンス型です。
値が変更できないと聞くとリストの下位互換だと感じてしまうかもしれませんが、タプルには要素を変更するようなメソッドが定義されていないためリストよりも軽くなっています。
なので、変更する予定のないデータや一時的に複数のデータをまとめたい時(関数の戻り値など)に使用されます。
また、要素を名前で呼び出せる辞書みたいな「名前付きタプル」というのも用意されています。
タプルの生成
空のタプルは、()
を使って生成します。
変数名 = ()
コンストラクタであるtuple()
を使っても生成することができます。
変数名 = tuple()
タプルの初期化
初期値となる要素を,(カンマ)
で区切って記述することでタプルを初期化することができます。()
はあっても無くても構いません。
変数名 = 要素1, 要素2, ..., 要素N
または
変数名 = (要素1, 要素2, ..., 要素N)
要素が1つの場合は、以下のように初期化できます。
変数名 = 要素,
タプルの要素の取得
タプルはシーケンス型なのでインデックスやスライスを使って要素を取得することができます。
t = 1, 'abc', 3.14
# インデックスの指定
t[0] # 1
t[1] # 'abc'
t[2] # 3.14
# スライス
t[0:2] # (1, 'abc')
t[1:2] # ('abc',)
t[1:len(t)] # ('abc', 3.14)
また、for
文を使ってそれぞれの要素にアクセスすることもできます。
t = 1, 'abc', 3.14
for e in t:
print(e)
# 1
# 'abc'
# 3.14
タプルの要素の変更
タプルは要素の追加・変更・削除を行うことができませんが再代入は可能となっています。つまりは、以下のように+
や+=
によって新たなタプルを代入することはできます。
t1 = 1, 2, 3
t2 = 4, 5
t = t1 + t2
print(t) # (1, 2, 3, 4, 5)
t1 += t2
print(t1) # (1, 2, 3, 4, 5)
また、一時的にリストに変換し、要素を追加・変更・削除した後にタプルに戻したりもできます。
t = 1, 2, 3
# リストに変換
l_t = list(t)
# 要素の追加
l_t.append(4)
print(l_t) # [1, 2, 3, 4]
# 要素の削除
l_t.remove(1)
print(l_t) # [2, 3, 4]
# タプルに変換
t = tuple(l_t)
print(t) # (2, 3, 4)
タプルの使いどころ
タプルはリストほど汎用性は高くありませんが、だからこそリストには向いてないけどタプルならできることが存在しており、状況に合わせてどちらを使うかが大事になってきます。
ここではタプルをどんな場面で使うか見ていきましょう!!
一時的に複数のオブジェクトをまとめたいとき
タプルは一時的に複数のオブジェクトをまとめたいときに最適です。例えば以下のコードのように関数で複数の要素を返したい際によく使われます。
def func():
# タプルで返す
return 1, 2, 3
val = func()
print(val) # (1, 2, 3)
# アンパックしてそれぞれ受け取る
val1, val2, val3 = func()
print(val1, val2, val3) # 1 2 3
リストでも同じ処理が出来ないわけではないですが、タプルの方が軽量なのでメモリを節約するためにタプルが使われます。
アンパックについては以下の記事を参照してください。
Link配列の要素を展開して変数に代入する方法を解説【アンパック】
要素に変更が必要ないコレクション
要素を追加・変更・削除しない、またはしたくない場合は、リストよりもタプルを使う。理由としてはリストより軽量なのはもちろんのこと、タプルの方が誤って要素を変更しにくい。
辞書のキーとして
タプルはリストと異なりイミュータブルなので辞書のキーとして指定することができます。
t1 = 0, 0, 1
t2 = 0, 1, 0
t3 = 1, 0, 0
d = {t1:1, t2: 10, t3: 100}
print(d) # {(0, 0, 1): 1, (0, 1, 0): 10, (1, 0, 0): 100}
タプルはリストより軽いのか?
タプルはリストよりも軽いと言われていますがどの程度なのか調べてみましょう。オブジェクトの__sizeof__
メソッドを呼び出すことでサイズを確認できます。
l = []
print(l.__sizeof__())
t = tuple()
print(t.__sizeof__())
実行結果
40
24
タプルはリストの半分ぐらいのサイズであることがわかりました。めちゃくちゃ変わるわけではありませんがタプルで十分なときはタプルを使うように心がけましょう。
まとめ
この記事では、Pythonのtuple(タプル)の使い方を解説しました。
複数の要素を扱いたい場合、柔軟性の高いリストを使うことが多いですが、要素の変更をあまりしない場合は、タプルを使った方がメモリを節約することができます。
それでは今回の内容はここまでです!ではまたどこかで〜( ・∀・)ノ