タプル(tuple)型とは?
Pythonのtupleは、要素が順序付けされた値の集合(コレクション)です。Excelの1行、または1列のように順番に値が入ります。値の取り出し方など、多くの点で共通しているので、リスト型の項目も参照してください。
リストとの大きな違いは、値を変更することができない点です。一度作成されたtupleの要素は変更、追加、削除することができません。
異なるデータ型の要素を含めることができ、要素を括弧()で囲んで定義します。
# tupleを作成する例
coordinates = (4, 5)
print(type(coordinates)) # 出力: <class 'tuple'>
tupleは複数の値を格納するために使用することができ、リストよりもメモリ使用量と処理時間のオーバーヘッドが小さいため、大規模なデータに対してより効率的です。そのため、機械学習やビッグデータを扱うプログラムや、その参考書などでよく見られます。
また、tupleはリストとは異なり、インデックスとして使用することができるため、ディクショナリーのキーとしても使用することができます。
Tupleの定義とアクセス
# Tupleの定義
t = (1, 2, 3)
# Tupleの要素にアクセス
print(t[0]) # 1
print(t[1]) # 2
print(t[2]) # 3
Tupleの定義には () を使いますが、各要素へのアクセスは [] 角括弧なので、リストと同様の記法でアクセスできます。その他のアクセスの記法は、リストの記事を参照してください。同様にアクセスできます。
要素が変更できないことの確認
# Tupleの定義
t = (1, 2, 3)
# Tupleの要素を変更するとエラーが発生
t[0] = 100 # 'tuple' object does not support item assignment
要素への参照はリストと同様に実行できましたが、上記のソースのように元々あるインデックスに値を代入しようとしても、例外エラーが出てしまいます。
特に、サンプルコードを移してきて少し変える……といった場合にこういったエラーを出してしまうことがあるので、注意してください。
Tupleを使った変数の交換
# 2つの変数
a = 1
b = 2
# Tupleを使って変数を一時的に保存
temp = (a, b)
# 変数を交換
a = temp[1]
b = temp[0]
print(a) # 2
print(b) # 1
少し変わった例として、変数の入れ換え(交換)にTupleを使う方法があります。
単に、
a = b
b = a
としようとしても、2行目では a の値が bで上書きされているので上手く交換することができません。
Tupleの定義に変数を使うことはできますが、その値は変更されないためサンプルコードのようにタプルを利用して変数の入れ換えを行うプログラムを書くことができます。他の言語、またPythonでも、第三の変数 c を用いて
c = a # a を一旦退避する
a = b
b = c # c に退避した a を bに代入する
と記述することもできます。
Tupleの利点であるオーバーヘッドの少なさが生かせるといったこともないので、自分が読みやすい方を用いればいいと思います。
tupleと辞書型の併用
# 辞書を作成
d = {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
# tupleからキーを取得
keys = ('key1', 'key2', 'key3')
# 辞書から値を取得
values = [d[key] for key in keys]
# 値を表示
print(values) # ['value1', 'value2', 'value3']
pythonの辞書型は、リストやtupleと同じく、インデックスと値のペアです。ただ前者2つが数字のみをキーとして使うのに対して、辞書型では文字列などもキーとして使える点が異なります。
現実の辞書のように、言葉(key)に対して意味(value)を与えるようなイメージをすると分かりやすいでしょう(詳しくは辞書型の解説を参照)。
Pythonでは、リストやtupleにキーのリストを格納することで、指定されたキーの値をまとめて取得することが出来ます。
上記の例では、辞書に格納された値をtupleを使って全て取り出して、リスト型として新しく保存しています。もちろん、キーの値を減らすことで、辞書型の一部のみをリスト型にすることができます。
また、tupleと辞書の併用では、以下のように複数の値からなるtupleをキーとして使えます。
person_info = {
('Tom', 25): 'Software Engineer',
('Jane', 30): 'Product Manager',
('John', 35): 'Data Scientist'
}
# tupleをキーとして辞書にアクセス
print(person_info[('Tom', 25)]) # 'Software Engineer'
print(person_info[('Jane', 30)]) # 'Product Manager'
これは、Tupleが不変の値で、hashable であるから可能です(同じように見えても、リストではこのコードを実行することはできません)。
上記のように名前だけだと一つの項目を特定しづらい場合に、名前と年齢のペアや、名字と名前のペアのように複数の値があれば特定できるようなデータに使われることがあります。これは特に、主キーが複合キーになっている RDBMSのテーブルを取得した場合などに、とても便利に使うことができます。
まとめ
このようにTupleは複数の要素をまとめて扱う際に使用できます。
- 複数の要素をまとめて処理する際に便利です。例えば、RPA で複数の座標をまとめて扱う際に便利です。
- 辞書やリストと同様に、tupleはインデックスを使って要素にアクセスすることができます。
- Tupleは変更不可能なデータ型ですので、不変性が必要なデータに有用です。個人でプログラムを作る場合には恩恵があまり感じられませんが、複数人で分担、誰が使うか分からない関数を定義する場合などに、Tuple型を用いると、変更してはいけない値を変更出来ないようにできます。また、辞書のキーにできるのも、この点の利点です。
- 関数の返り値として複数の値を返す際に使用することができます。
- Tupleを使用することで、関数に複数のパラメータを渡すことができます。
- Tupleは異なるデータ型を持った要素を含めることもできます。例えば、数値と文字列が同じTupleに格納されているなどです。
このように、tupleは様々な用途に使われます。最初はリストでいいと思われがちですが、ライブラリを活用したり、統計データやAIの活用などでは必須と言ってもいいので、基本的な性質は覚えておきましょう。