タプル(tuple)

【Python】タプルの基本と使いどころ

【Python】タプルの基本と使いどころ

Pythonのタプルの基本と使いどころについて解説します。

タプルの特徴と基本的な使い方

Pythonのタプル(tupleとは、リストと同様で任意の要素を集めて列挙したシーケンスです。

この記事では、タプルの特徴や作成方法など基本的な点について説明していきます。

タプル(tuple)の特徴

タプルは、リストに非常に似ていますがイミュータブル(immutable)であるという点が異なっています。

イミュータブル(immutable)は、変更不可を意味します。一方で、リスト等のように値の変更が可能であることをミュータブル(mutable)と言います。

この特徴のため、タプルは一度生成したら要素追加や値の変更といった変更操作ができません。一方で、リストであれば値を変更したり、appendメソッドで要素を追加したりできます。

タプル(tuple)の基本的な使い方

タプル作成と要素へのアクセス

タプル(tuple)の基本的な使い方を見ていきましょう。タプルを作成するには以下のように()で要素を順番に列挙します。

# タプルの作成方法
tpl = ('A', 'B', 'C')
print(type(tpl))
print(f'tpl: {tpl}')
print(tpl[0], tpl[1], tpl[2])
【実行結果】
<class 'tuple'>
tpl: ('A', 'B', 'C')
A B C

タプルの各要素にアクセスするにはリストと同様に[]でアクセスできます。(位置は0から始まりますので注意しましょう)

括弧なしでタプルを作成する

タプルは、以下のように括弧「()」なしで、「,」(カンマ)で要素を列挙するだけでも作成できます。

# ()がなくてもタプルとして作成される
tpl = 'A', 'B', 'C'
print(type(tpl))
print(f'tpl: {tpl}')
【実行結果】
<class 'tuple'>
tpl: ('A', 'B', 'C')

上記結果を見ると分かるようにタプルで作成されていることが分かると思います。括弧なしでもタプルと認識されますが、明示的に括弧を使用することが推奨されます。ここでは、()を用いなくてもタプルとして扱われるということを覚えておいてください。

タプルのアンパック

アンパックの基本的な考え方

タプルの要素は、以下例のように異なる変数に簡単に代入することができます。このような方法をタプルのアンパック(またはアンパック代入)と言います。

# タプルのアンパック
tpl = ('A', 'B', 'C')
a, b, c = tpl
print(f'a = {a}, b = {b}, c = {c}')
【実行結果】
a = A, b = B, c = C

変数を列挙した定義はタプルのアンパック

Pythonを勉強を始めると、以下のように変数を列挙して値を代入できることを知ります。実は、これはタプルのアンパックをしています。

a, b, c = 'A', 'B', 'C'
print(f'a = {a}, b = {b}, c = {c}')
【実行結果】
a = A, b = B, c = C

上記例において「a, b, c = 'A', 'B', 'C'」の右側はタプルとなっています。上記で()がなくてもタプルとして生成されるということを紹介したことを思い出してください。つまり、このコードの実態としては、タプルが生成されて、アンパックされたうえで各変数に代入されているという動きとなっています。

アンパックを利用した値の交換

タプルのアンパックを使うと、以下のように要素の交換を簡単に実施できます。

data1 = "A"
data2 = "B"
print(
    f"data1: {data1}, id(data1): {id(data1)}, "
    f"data2: {data2}, id(data2): {id(data2)}"
)

# 要素の交換
data1, data2 = data2, data1
print(
    f"data1: {data1}, id(data1): {id(data1)}, "
    f"data2: {data2}, id(data2): {id(data2)}"
)
【実行結果】
data1: A, id(data1): 1234656225968, data2: B, id(data2): 1234655913072
data1: B, id(data1): 1234655913072, data2: A, id(data2): 1234656225968

※ 上記例のid値の部分は実行ごとに変わりますのでご注意ください。

上記結果では、値とidを表示していますが、data1data2の内容がしっかりと交換できていることが分かります。

タプルの使いどころ

値が変更されたくないときに利用する

タプルがリストと違って特徴的なところは、イミュータブル(immutable)であることです。

この特徴から、プログラム上で変更されたくない項目を管理する場合にタプルを使用することがおすすめされます。例えば以下のようなケースが考えられます。

  • 関数の戻り値:関数が複数の値を返却する際に、タプルでまとめるのは便利です。例えば、座標(x, y)のペアや複数の計算結果を返すときなどが該当します。
  • 変更されるべきではない値の管理:日付や設定値のように変更する必要がないデータをタプルで保持することで誤った変更を防ぐことができます。
  • キーとしての使用:タプルはハッシュ可能であるため、辞書のキーとして使用できます。例えば、座標(x, y)に対応する値を管理する辞書などが典型的な例です。

名前付きタプル(namedtuple

上記で紹介したようにタプルは関数の戻り値で複数項目を返却する場合に便利です。しかし、どの要素に何が入っているのかが分かりにくいという欠点もあります。

そのような際には、collectionsモジュールの名前付きタプル(namedtupleの使用を検討してみてください。namedtupleは、項目に名前を付けることでアクセスが容易になります。

namedtupleについては「namedtupleで名前付きタプルを使用する」を参考にしてください。

まとめ

Pythonのタプル(tuple)の基本と使いどころについて解説しました。

タプルは、イミュータブル(immutable)で変更不可能であるというのが特徴です。この記事では、タプルの基本的な作成方法やアンパックの考え方を紹介しました。

タプルは、変更不可であることが特徴です。この特徴からプログラム実行中に変更されたくないような設定値等に使うことが便利です。

タプルは、リストや辞書などと同様にPythonプログラミングにおける代表的なものですので、特徴をしっかりと理解して使いこなせるようになってもらいたいと思います。