タプルとは
・タプルは「,」(カンマ)区切りの要素を()で囲みます
・要素が1つだけのタプルの場合、末尾にカンマが必要です
・タプルの要素を参照するには、インデックスを指定します
・リストと異なり一度生成されたタプルは要素の変更・追加・削除ができません。
・リストは要素を,(カンマ)区切りで並べて[]で囲みますが、タプルは()で囲みます。


タプルとリストの使い分け
値を変更したり削除する場合はリスト、何らかの定数のように一度決めたら変更しない値を格納するときはタプルのように使い分けます。


リストとタプルの違い
# リスト: [] で囲む
test_list = [1, '2', True]

# タプル: ()で囲む
test_tuple = (1, '2', True)

要素の参照は、リストと同様にインデックスを指定します。
print(test_tuple[0])  # 1 が表示される


関数名にタプルを定義し、for文を使って1つずつ取得する
def main():
    programming_lang = ("Python 1991", "Ruby 1995", "Go 2009")

    for lang in programming_lang:
        print(lang, '年生まれ')


要素が1つしかないタプルを定義するときは、値の後に,(カンマ)をつける必要があります。,(カンマ)がないと、タプルではなく値になってしまいます。

# タプル要素が1つの場合、末尾に , が必要
one_tuple = ('Python',)
print(one_tuple)  # ('Python',)と表示される → タプル

# 末尾に , がないとタプルにならない
value = ('Python')
print(value)  # Pythonと表示される → 文字列


アンパック代入
・アンパック代入は、タプルやリストの各要素を複数の変数にまとめて代入する方法です
・タプルの要素を複数の変数へ代入する際に、以下の書き方でまとめて代入できます。
・タプルだけでなく、リストや文字列でもアンパック代入できます。

 

注意点
・一度に複数の変数へ値を代入できるアンパック代入は便利ですが、要素数と同じ数の変数へ代入する必要があります。
・変数と要素数が一致しないとValueErrorが発生します。

例)
def main():
    a,b,x,y,z = (100,200,1,2,3)

    print(a)  # 100と表示される
    print(b)  # 200と表示される


    print(x)  # 1と表示される
    print(y)  # 2と表示される
    print(z)  # 3と表示される


if __name__ == "__main__":
    main()


タプルの各要素をアンパック代入
    a, b = (100, 200)
    print(a)  # 100と表示される
    print(b)  # 200と表示される


リストの各要素をアンパック代入
    x, y, z = [1, 2, 3]
    print(x)  # 1と表示される
    print(y)  # 2と表示される
    print(z)  # 3と表示される
 

複数の値をまとめて複数の変数に代入する場合、右辺の括弧を省略して以下のようにも書けます。
a, b = 100, 200


アンパック代入を使ってfor文を作成してみる

def main():
    python = ('Python', 1991)          ※タプルを3つ作成している
    ruby = ('Ruby', 1995)
    go = ('Go', 2009)

    programming_lang = (python, ruby, go)    ※関数内で定義したタプルを1つのタプルにまとめて代入したタプルを定義する

    for lang in programming_lang:
        name, year = lang            ※2つの変数に同じ値を代入することができる。

        print(name, year, '年生まれ')


タプルを辞書のキーとして使用する
・タプルは辞書のキーとして使用できる
d = {(1, 2): 'A'}
 

・リストを辞書のキーにするとTypeErrorが発生します。
d = {[1, 2]: 'A'}

例)
def main():
    tuple_key_dict = {(1,2):"A"}
    print(tuple_key_dict[(1,2)])   

※キーがタプルの(1,2)なので指定する場合は[(1,2)]とする。これでこれまでの[0]と同じ

main()


タプルを辞書のキーする例
タプルを辞書のキーとして使うことで、たとえば(緯度, 経度)を入れたタプルをキーにして、値を都市名にすることで、座標から都市名を取り出せる辞書が作れます。


ミュータブル・イミュータブルとは
タプルの値は変更できないようになっていますが、このように値を変更できないことを「イミュータブル」と呼びます。
リストは後から要素の追加や削除ができます。このように値が変更可能なことを「ミュータブル」と呼びます。
辞書のキーには文字列や数値、タプルなど変更不能な値のみ使用できます。

辞書とタプルをfor文で回して処理するやり方
def main():
    python = (1991, 'Guido')
    ruby = (1995, 'Matz')
    go = (2009, 'Rob')

    lang_dict = {(python):"Python", (ruby):"Ruby", (go):"Go"}

    for lang_info, lang_name in lang_dict.items():
        year,name = lang_info           
        print(year,name,lang_name)

※アンパック代入をせずにそのままprint(lang_info,lang_name)と設定するとタプルの形でそのまま表示されるので、変数に代入する必要がある

for lang_info, lang_name in lang_dict.items():
        print(lang_info,lang_name)

こうすると以下のようにタプルがそのまま表示される

 (1991, 'Guido') Python
 (1995, 'Matz') Ruby
 (2009, 'Rob') Go