Pythonのタプルは、リストと同じように要素をインデックスで管理するオブジェクトです。リストと同じく、学習の早い段階で触れるものですが、タプルとリストは何が違うのか、リストがあるにも関わらずなぜタプルがあるのか、と疑問に思われることも多いオブジェクトです。
ここではその違いに触れながら、タプルでできる基本的な操作をまとめています。ぜひ参考にして頂ければと思います。
1. タプルとは
まず、タプルとは何かを理解するために、ここではタプルの作成方法と、タプルの特徴とリストとの違いについて解説します。
1.1. タプルの作成方法
1.1.1. 丸括弧 () に要素をカンマ区切りで格納して作成
タプルはリストと同じように複数の要素を格納するオブジェクトで、丸括弧 () の中に要素をカンマで区切って格納して作成します。
tuple = (1, 2, 3, 4, 5)
print(tuple)
実は、以下のように、丸括弧 () で囲わなくてもタプルは作成できます。
tuple = 1, 2, 3, 4, 5
print(tuple)
しかし、これだとそれがタプルを作成しているコードであることが、第三者から見て分かりにくいので使うことはほぼありません。
1.1.2. tuple()関数で作成
タプルは、tuple()関数で、別の型のオブジェクトをタプルに変換することでも作成できます。
以下のコードでは、リストとset(集合)をtuple()関数でタプルに変換しています。
リストについては、「Pythonのリストの基本的操作まとめ」で、setについては「Pythonのset(集合)の基本的操作のまとめ」で解説しています。
list = [1, 2, 3, 4, 5]
tuple1 = tuple(list)
print(tuple1)
set = {1, 2, 3, 4, 5}
tuple2 = tuple(set)
print(tuple2)
辞書をタプルに変換する際は、キーと値のどれをタプルに変換するかによって、辞書型メソッドのkeys(), values(), items()を使い分ける必要があります。
なお辞書については、「Pythonの辞書(dict)の基本的操作の全て」で学習することができます。
dict = {'a':1, 'b':2, 'c':3}
tuple3 = tuple(dict.keys())
print(tuple3)
tuple4 = tuple(dict.values())
print(tuple4)
tuple5 = tuple(dict.items())
print(tuple5)
1.2. タプルの特徴とリストとの違い
このように、タプルはリストと同じで、要素をインデックスで管理するオブジェクトです。そのためリストとの違いに疑問を持たれることが多いです。
タプルはリストと違って次のような特徴があります。
- タプルはイミュータブル(変更不可能)。
- リストと比べて使用するメモリが小さくコンピュータに対する負荷が少ない。
- 全体的にリストより処理速度が早い。
まず、プログラミングの実践上、最も重要な点は、リストはミュータブル(変更可能)であるのに対して、タプルはイミュータブル(変更不可能)であるということです。
この特徴のため、一度作ったタプルに要素を追加したり削除したりなどの変更はできません。
例えば、リストにはappend()メソッドという要素を追加するメソッドがあります。これは既にあるリストに要素を追加する(=変更を加える)ものです。「Pythonのリストに要素を追加,結合/連結する方法まとめ」で解説しています。
list = [1, 2, 3, 4, 5]
list.append(6)
print(list)
タプルはイミュータブル(変更不可能)なので、このようなメソッドはありません。
tuple = (1, 2, 3, 4, 5)
tuple.append(6)
print(tuple)
メソッドのほとんどは、そのオブジェクトに変更を加えるものです。
そのためミュータブル(変更可能)なオブジェクトであるリストは11個のメソッドがあるのに対して、イミュータブル(変更可能)なオブジェクトであるタプルでは、オブジェクトに変更を加えるものではない2個のメソッドしか使うことができません。
タプルのメソッド | リストのメソッド |
---|---|
count() index() | append() clear() copy() count() extend() index() insert() pop() remove() reverse() sort() |
なお、リストのメソッドについては、「Pythonのリストの基本的な操作まとめ」で解説していますので、ぜひご確認ください。
さて、このように、タプルはリストに比べて利用できるメソッドが少ない(=できることが少ない)のに、なぜ存在するのだろうと誰もが一度は疑問に思います。
結論から言うと、タプルは、イミュータブル(変更不可能)であるため、例えば時刻や住所など、一度作ったら後から変更する可能性がほとんどないデータを格納するためのオブジェクトです。
単純に、一度データを格納したら、その中身を絶対にいじって欲しくない場合に使うものです。
これについては「Pythonのリストとタプルの違いと使い分け方」でも、さらに詳しく解説しています。
2. タプルの結合
それでは、ここからタプルで可能な基本的操作を見ていきましょう。なお、タプルはリストより使えるメソッドが少ないだけで、結合や要素の取得、関数による操作など、タプルに変更を加えないものであれば、リストとほとんど同じことができます。
それでは、まずはタプルの結合を見ていきましょう。
+演算子でタプル同士を結合した新しいタプルを作ることができます。
t1 = (0, 1, 2)
t2 = (3, 4, 5)
t3 = t1 + t2
print(t3)
タプルはイミュータブルなオブジェクトですが、+=演算子は例外で、左辺のタプルに右辺のタプルを追加して上書きすることができます。
t1 += t2
print(t1)
3. タプルの要素の取得
続いてタプルの要素の取得について見ていきましょう。これもリストと同じです。
3.1. スライスで要素を取得
まず、角括弧 [] にインデックス番号を指定することで、そのインデックスに対応する値を取得することができます。
以下のコードをご覧ください。
なお、このコードではrange()関数を使ってタプルを作っています。range()関数については「Pythonのrange()関数を使ったリスト作成や繰り返し処理の書き方」をご確認ください。その中で解説しているlist()関数をtuple()関数に変えるとタプルを作成することができます。
tuple = tuple(range(10))
print(tuple)
print(tuple[1])
print(tuple[-2])
なお、タプルはイミュータブル(変更不可能)のため、以下のように、特定のインデックスの要素を変更することはできません。
tuple = tuple(range(10))
tuple[0] = 10
しかし、次のように、スライスで取得したタプルの要素を別の変数に代入して、新しいタプルを作ることはできます。
tuple1 = tuple[0:5]
print(tuple1)
tuple2 = tuple[5:]
print(tuple2)
なお、タプルのスライスに関しては、リストのスライスと全く同じですので、詳しくは「Pythonのリストのスライスと分割」でご確認ください。
3.2. タプルの要素の取り出し(for文)
タプルもイテラブルなので、for文で要素を一つずつ取り出すことができます。
tuple = (1, 2, 3, 4, 5)
for i in tuple:
print(i)
for文については「Pythonのfor文によるループ処理の書き方の全て」で解説しています。
4. タプルの要素の検索
次にタプルの要素の検索方法です。
4.1. 要素の存在確認|in文
タプルの中に指定の要素が存在するかどうかはin文で調べることができます。
存在すればTrue、存在しなければFalseを返します。
tuple = (1, 2, 1, 3, 1, 4, 5)
print(1 in tuple)
print(0 in tuple)
4.2. 任意の要素の数を調べる|count()
count()メソッドは任意の要素が何個存在するかを返してくれます。
tuple = (1, 2, 1, 3, 1, 4, 5)
print(tuple.count(1))
4.3. 任意の要素のインデックスを調べる|index()
index()メソッドは、任意の要素が一番最初に見つかったインデックス番号を返してくれます。
tuple = (1, 2, 1, 3, 1, 4, 5)
print(tuple.index(1))
なお、インデックス番号は、リストと同じように前から数える場合は0から始まり、後ろから数える場合は-1から始まります。インデックス番号は「Pythonのリストのスライス」で詳しく解説しています。
5. まとめ
ここまで見てきたように、タプルとリストの最大の違いは、タプルはイミュータブル(変更不可能)でリストはミュータブル(変更可能)という点にあります。
このため、タプルは時刻や住所など変更する可能性がほとんどないデータを格納するために使います。
また、この違いから、タプルでは要素に変更を加えるメソッドが存在しないため、使えるメソッドはたったの2つしかありません。リストで使えるほとんどのメソッドが使えないので覚えておきましょう。
しかし、関数はオブジェクトに変更を加えるものではないため、関数を使った操作の場合は、リストとほとんど同じことができます。
コメント