タプル(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)


タプルのアンパックを使って結果を出した
アンパックは辞書みたいにキーとバリューを両方出すイメージで使える