Pythonのコンテナ型。第3回はタプルです。
タプルの新規作成
タプルとは簡単に言えば「イミュータブル(変更不可)なリスト」です。まずはタプルを作成してみます。
tup1 = (1,2,3)
tup2 = (4,)
tup3 = "a","b","c",1,2,3,[4,5,6]
print(tup1) #(1, 2, 3)
print(tup2) #(4,)
print(tup3) #('a', 'b', 'c', 1, 2, 3, [4, 5, 6])
最も一般的な作成方法は、複数の値を丸括弧()で囲む方法です。print関数に入れるとそのままの表記で表示されます。これがタプルです。
注意すべきは2行目。リストや辞書と違って値が1つしか無いタプルを作成するときは、値の後ろにカンマを付けるのを忘れないようにしましょう。このカンマが無いと、数値演算の()と勘違いされてしまいます。
tup2 = (4)
print(tup2) #4
これはタプルの作成方法としてはNG。コンソールに出力された「4」はただの数値です。
さらに3行目も見てみましょう。この行では丸括弧が使用されていません。ただ複数の値を変数に代入しているだけですが、これも正しいタプルの作成方法です。
タプルは要素の重複が可能で順番を持ち、作成した後で要素の追加や削除ができないという性質を持っています。そのためユーザーが(不親切にも)ただ複数の値を変数に代入しただけの場合、Pythonが選択するべき最も安全でベストに近い型はタプルです。
タプルの操作
ではタプルの各要素にアクセスしていきましょう。この操作はリストと同様ですので、リストに慣れた皆さんであれば簡単にマスターできるはずです。
tup = ("a","b","c",1,2,3,[4,5,6])
print(tup[1]) #b
print(tup[2:4]) #('c', 1)
print(tup[6][2]) #6
基本的にはインデックス番号を指定することで各要素にアクセスできます。リストと同様、スライスで取り出す範囲を指定したり、要素として含まれるコンテナ型の要素単体にアクセスする方法も同じです。
タプルができないこと
しかしタプルはイミュータブルのため、このように要素を追加したり削除したりすることはできません。
tup = ("a","b","c",1,2,3,[4,5,6])
tup.append(7)
#AttributeError: 'tuple' object has no attribute 'append'
tup = "a","b","c",1,2,3,[4,5,6]
del tup[0]
#TypeError: 'tuple' object doesn't support item deletion
タプルができる数少ないこと
タプルが持っているメソッドは、指定した値の個数を数えるcount()と、要素のインデックス番号を抽出するindex()のみ。
tup = ("猫","猫","犬","猫","犬","猫","cat")
print(tup.count(1)) #4
print(tup.index("cat")) #6
これ以外にもできることはありますが、タプルが持っているメソッドではなく関数となります。
ただタプルはタプルを連結して、新たなタプルを作成することは可能です。
tup = "a","b","c",1,2,3,[4,5,6]
tup += ("d","e","f")
print(tup) #('a', 'b', 'c', 1, 2, 3, [4, 5, 6], 'd', 'e', 'f')
タプルはタプルとしか連結できないということには注意しましょう。
不便さで安全を買う
このようにできることが極端に少なく、制限が多い不便な型であるタプルですが、そうであるが故に「安全な型」であるとも言えます。
例えば静的型付け言語のJavaは、以下のようなコードを許していません。
String num = "iPhone";
num = 10;
一度文字列を代入した変数は、文字列以外を代入し直すことができません。これはPythonやJavascriptに慣れた方には面倒で不便に映りますが、だからこそ「これは文字列が代入された変数である」と保証されます。
タプルも同様に制限が多く不便であるからこそ、辞書のキーになることが許される「信頼性のある」型になっています。
要素や要素数を変更する予定が無い場合、リストよりもむしろタプルが選ばれる場面は少なくありません。