タプル(tuple)はリストと同じようなデータ構造ですが、変更不可(イミュータブル)という特徴があります。
(1, 2)のように丸括弧を使って表現します。ただし、自明な場合は丸括弧を省略できます。
たとえば、a = (1, 2)は、a = 1, 2と記述できます。
・リストと同じくイテラブルです。
・リストと同じくインデックスを使って参照できます。
・要素は何でも入れられますが、作成後に変更できません。
・タプルにタプルを入れられます。
タプルのメソッド
・index(item[, start[, end]])
itemを探し、その位置を返します。見つからなければエラー(ValueError)になります。
探索範囲は、startからendの前までで、返り値は[start, end)の範囲になります。省略すると全体を探します。
・count(item)
itemの出現回数を返します。
タプルの書き方の補足
要素数が1個以下の書き方のサンプルをリストと比較してみましょう。
要素数 リスト タプル
0 [] ()
1 ['sample'] ('sample', )
注目すべきは、要素数が1個のときのタプルの書き方です。
要素の後ろにカンマが必要になります。カンマがないとタプルになりません。
タプルは変更不可のため、以下のようなところで利用されます。
集合(set)の要素。
辞書(dict)のキー。
変更されないことを保証したいとき。
リスト、タプル、集合、辞書はイテラブルです。
また、イテラブルからリスト、タプル、集合、辞書を作成できます。
例を見てみましょう。
リスト:list(range(3))は、rangeオブジェクトからリストにしています。
タプル:tuple(range(3))は、rangeオブジェクトからタプルにしています。
集合:set(range(3))は、rangeオブジェクトから集合にしています。
辞書:dict([('pine', 0), ('apple', 1)])は、タプルのリストから辞書にしています。
辞書の場合だけ、「イテラブルの要素が、2要素のタプルまたはリスト」でないといけません。
タプルのアンパック
タプルは1つのオブジェクトですが、複数の変数に同時に代入できます。
これをアンパックといいます。
items = ('art', 'box', 'cup')のときに、a, b, c = itemsとすると、a, b, cそれぞれに文字列が入ります。
たとえば、a == 'art'になります。
タプルの個数と変数の個数が異なると、エラー(ValueError)になります。
個数が不明のときには、アスタリスク(*)を使ってアンパックできます。
a, *b = itemsとすると、a == 'art'に、b == ['box', 'cup']になります。
この場合bは中身がリストになっているので注意
forでのアンパック
for i, j in [(1, 2), (3, 4)]:
print(i, j)
たとえば、上記のようにforの変数に対しても使えます。下記のように出力されます。
1 2
3 4
値の交換
a, b = b, aとすると、値の交換ができます。
アンパックしない場合は、下記のようになり煩雑です。
tmp = a
a = b
b = tmp
タプルはリストと同じように「+」で連結できます。
演習問題
sales = ((1, 100), (2, 30), (7, 150), (11, 120), (10, 100))
for x, y in sales:
if x <= 10 and y >= 100:
print((x,y))
結果
(1, 100)
(7, 150)
(10, 100)
タプルのアンパックを使って結果を出した
アンパックは辞書みたいにキーとバリューを両方出すイメージで使える