データ構造-タプル
記事の内容
この記事では、Python組み込みのデータ構造の1つであるタプルについて説明します。
***わからない用語があるときは索引ページへ***
1.タプルの基本
タプルオブジェクトは、リストオブジェクトと同じイテラブルなオブジェクトであり、リストとよく似たオブジェクトです。
2.タプルの書き方
タプルの定数は、
(<要素1>, <要素2>,・・・)
の規則で記述します。少しクセがあって、要素が1つだけの場合は、
(<要素1>,)
と後ろに","(カンマ)を付け加える必要があります。
これを除けば書き方としてはリストの[]が()に変わっただけですね。
##タプル定数の記述
tuple1 = (0, 1, 2, 3, 4)
print("タプル:", tuple1)
##要素が1つだけの場合は、","(カンマ)を忘れずに
tuple2 = (0,)
print("要素が1つだけのタプル:", tuple2)
出力結果:
タプル: (0, 1, 2, 3, 4)
要素が1つだけのタプル: (0,)
書き方の規則を文字でまとめると、
・タプルに含めるデータを()で囲む
・要素と要素は","(カンマ)で区切る
・要素の数が1つだけの場合は、最後に","(カンマをつける)
・要素が1つもない空のリストも表現でき、()で表す
・タプルの要素のデータ型は揃ってなくても良い
・要素にできるオブジェクトの型は問わない
・要素数に制限はない
・ネストの深さに制限はない
・タプルの一番外側の()は省略して表記することができる
となります。
タプルの一番外側の()は記述を省略できます。
tuple1 = (0, 1, 2, 3, 4)
は、
tuple1 = 0, 1, 2, 3, 4
と表記することもできます。
3.タプルの要素の読み込み
タプルはイテラブルなオブジェクトなので、リストと同じ方法でインデックスを使ってデータにアクセスすることができます。
##タプルの要素を読み込む
tuple1 = (0, 1, 2, 3, 4)
print("タプル:", tuple1)
##インデックスが2の要素(3番目の要素)を読み込む
print("インデックスが2の要素:", tuple1[2])
実行結果
タプル: (0, 1, 2, 3, 4)
インデックスが2の要素: 2
タプルオブジェクトは、1つ1つの要素にばらして読み込むこともできます。
##タプルの要素を読み込む
tuple1 = (0, 1, 2, 3)
print("タプル:", tuple1)
##タプルを要素にばらして読み込む
num0, num1, num2, num3 = tuple1
##それぞれの要素を出力
print("num0 =", num0)
print("num1 =", num1)
print("num2 =", num2)
print("num3 =", num3)
出力結果
num0 = 0
num1 = 1
num2 = 2
num3 = 3
4.どこでタプルを使う?
タプルは関数のデータのやりとりで頻繁に利用されます。何個かのデータを箱詰めするような感じでタプルにまとめて関数の引数として渡したり、関数の戻り値が複数あるときに、戻り値を1つのタプルオブジェクトにまとめて返したりします。詳細は関数の記事で説明します。
5.タプルは要素の書き換えができない
タプルはリストと違って、オブジェクトの要素を書き換えることができません。このように、要素を書き換えできないデータ構造のオブジェクトをイミュータブルなオブジェクトと呼びます。
要素を書き換えたいときはlist()関数を使ってミュータブルなオブジェクトに変換し、別の変数に代入してから書き換えます。
##書き換えはリストに変換して別の変数で。
tuple1 = (0, 1, 2, 3, 4)
##リストオブジェクトに変換してから要素を追加
list1 = list(tuple1)
list1.append(5)
print("元のタプル:", tuple1)
print("リストにキャストして要素を追加:", list1)
##tupple()関数を使ってリストをタプルにキャストすることもできる
tuple2 = tuple(list1)
print("リストからタプルへキャスト:", tuple2)
実行結果
元のタプル: (0, 1, 2, 3, 4)
リストにキャストして要素を追加: [0, 1, 2, 3, 4, 5]
リストからタプルへキャスト: (0, 1, 2, 3, 4, 5)
6.スライスを使って部分タプルを取り出す
タプルはイテラブルなオブジェクトなので、リストと同様、スライスを使って一部の要素を抜き出すことができます。スライスの詳細説明はこちら
##書き換えはリストに変換して別の変数で。
tuple1 = (0, 1, 2, 3, 4)
print("元のタプル:", tuple1)
##スライスを使って抜き出し
print("[2:4]:", tupple1[2:4])
print("[:3]:", tuple1[: 3])
print("[3:]:", tuple1[3:])
print("[-4: -2]:", tupple1[-4: -2])
print("[-3:]:", tuple1[-3:])
print("[: -3]:", tuple1[: -3])
出力結果
元のタプル: (0, 1, 2, 3, 4)
[2:4]: (2, 3)
[:3]: (0, 1, 2)
[3:]: (3, 4)
[-4: -2]: (1, 2)
[-3:]: (2, 3, 4)
[: -3]: (0, 1)
7.タプルの連結、繰り返し連結
演算子"+"を使って2つのタプルオブジェクトを連結することができます。また、演算子"*"を使って繰り返し連結をすることもできます。
##タプルの連結と繰り返し連結
tuple1 = (0, 1, 2)
tuple2 = (3, 4, 5)
print("tuple1:", tuple1)
print("tuple2:", tuple2)
print("tuple1 + tuple2 =", tuple1 + tuple2)
print("tuple1 * 3 =", tuple1 * 3)
出力結果
tuple1: (0, 1, 2)
tuple2: (3, 4, 5)
tuple1 + tuple2 = (0, 1, 2, 3, 4, 5)
tuple1 * 3 = (0, 1, 2, 0, 1, 2, 0, 1, 2)
8.タプル関連の関数
タプル関連の組み込み関数です。
8.1.len(obj)
データ構造のオブジェクトobjを引数にとって、要素の数を返します。
tuple1 = (0, 1, 2)
print("タプルの要素数:", len(tuple1))
出力結果
タプルの要素数: 3
8.2.tuple(iterable)
イテラブルなオブジェクト(リストオブジェクトなど)を引数にとって、タプルにキャストします。上記4.のサンプルプログラムに使い方を記載しましたので参照ください。
9.タプルで使えるメソッド
タプルはイミュータブルなオブジェクトで要素を書き換えることができないので、使えるメソッドはリストよりもぐっと少なくなります。
9.1.count(elem)
引数elemで指定する要素の数を数えます。
tuple1 = (0, 1, 2 , 1, 0)
print("要素0の数:", tuple1.count(0))
実行結果
要素0の数: 2
9.2.index(obj)
引数で指定するオブジェクトと合致する最初の要素のインデックスを返します。引数と合致する要素がない場合は例外処理が発生します。
tuple1 = (0, 1, 2 , 1, 0)
print("1のインデックス:",tuple1.index(1))
実行結果
1のインデックス: 1