Pythonのタプルとは、不変(変更不可)な順序付きの要素の集合のこと。
リストと非常に似ていますが、リストは可変(変更可能)ですが、タプルは一度定義されると、その要素を変更することはできないという点で異なります。
参考 リストとは?

このページではPython初心者向けにタプル(tuple)とは何か?どのように利用すればよいか?を3分でわかりやすくサンプルコード付きで解説します。
Pythonエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。
Python:タプルとは?
Pythonのタプルとは、不変(変更不可)な順序付きの要素の集合のこと。

タプルはリストと同じようにさまざまな種類のデータを格納することができます。各データ項目は一意のインデックスによって参照され、整数型で0から始まるという点も同様です。

例えば、あなたが旅行に行くときにリュックサックに何か入れるとしましょう。このリュックサックはあなたのタプルだと考えてみてください。それぞれのアイテム(水筒、地図、カメラなど)はタプルの要素となります。一旦リュックサックがパックされ、旅行が始まったら、その中身は変えることができない(不変性)というのがタプルのイメージです。
リストは順序を持つ可変のデータ型です。つまり、一度定義した後で様々な変更を行うことが可能な点でタプルとは異なります。
fruits = ['apple', 'blueberry', 'cherry'] fruits.append('date') # リストの末尾に新しい要素を追加します print(fruits) # ['apple', 'blueberry', 'cherry', 'date']が出力されます
参考 print関数

リストについて復習しておきたい方は以下の記事をご覧ください。
Python:タプルの定義と作成
Pythonでタプルを作成するには、複数の値をカンマで区切り、その全体を丸括弧(()
)で囲みます。以下が基本的な構文ルールです。
my_tuple = (1, "two", 3.0)

この例では、整数、文字列、浮動小数点数といった異なるタイプの値を同じタプルに格納しています。これはタプルが異なる種類のデータを格納できるという特性を示しています。
また、タプルを作成する際には括弧を省略することも可能です。以下は上記の例と同じタプルを作成するもう一つの方法です。
my_tuple = 1, "two", 3.0
ただし、要素が1つだけのタプルを作成する場合、その要素の後にカンマを追加する必要があります。これはPythonがこの表現を単なる括弧と混同しないようにするために必要なルールです。
single_element_tuple = (1,) # 正しい not_a_tuple = (1) # 誤り( これはただの数値として認識される )
Python:タプルへのアクセス
タプルは順序付きの集合であるため、各要素は一意のインデックスを持ちます。インデックスは0から始まります。タプルの最初の要素はインデックス0、2つ目の要素はインデックス1、というようになります。

タプルから特定の要素を取り出すには、その要素のインデックスを角括弧([]
)の中に書きます。
my_tuple = ('apple', 'banana', 'cherry', 'date') print(my_tuple[0]) # 'apple'を出力 print(my_tuple[1]) # 'banana'を出力 print(my_tuple[2]) # 'cherry'を出力 print(my_tuple[3]) # 'date'を出力
また、Pythonではマイナスのインデックスを使用してタプルの末尾からアクセスすることも可能です。例えば -1
は最後の要素、 -2
は最後から2番目の要素を指します。
my_tuple = ('apple', 'banana', 'cherry', 'date') print(my_tuple[-1]) # 'date'を出力 print(my_tuple[-2]) # 'cherry'を出力 print(my_tuple[-3]) # 'banana'を出力 print(my_tuple[-4]) # 'apple'を出力
このように、正または負のインデックスを使用してタプル内の特定の要素にアクセスすることができます。

ただし、存在しないインデックスにアクセスしようとすると、Pythonはエラー(IndexError
)を発生させます。例えば、4つの要素しかない上記のタプルで my_tuple[4]
または my_tuple[-5]
にアクセスしようとするとエラーになります。
タプルの不変性(イミュータビリティ)は、タプルが作成された後はその要素を変更、追加、削除することができないという特性を指します。この性質は、一度設定したら変更されるべきでないデータを安全に保持するのに便利です。
t = ('apple', 'banana', 'cherry') # 要素の変更は不可 t[0] = 'avocado' # TypeError: 'tuple' object does not support item assignment # 同様に要素の追加や削除も不可能 t.append('date') # AttributeError: 'tuple' object has no attribute 'append' del t[0] # TypeError: 'tuple' object doesn't support item deletion
Python:タプルのスライシング
タプルは一度定義したらそこから変更することはできませんが、どうしてもタプルの中の一部だけを取り出して使いたい場合もあります。そこで利用するテクニックがスライシングです。
タプルのスライシング(=要素の一部を取り出す操作)は、タプルの一部を新たなタプルとして取り出す操作です。
new_tuple = old_tuple[start:stop]

start
はスライスが始まるインデックス、stop
はスライスが終わるインデックスの次の位置を指します。start
を省略すると、スライスはタプルの始めから開始され、stop
を省略するとタプルの終わりまでスライスされます。
実際のスライス操作を見てみましょう。
my_tuple = ('apple', 'banana', 'cherry', 'date', 'elderberry') slice1 = my_tuple[1:4] # インデックス1からインデックス3までを取得 print(slice1) # 'banana', 'cherry', 'date'を出力 slice2 = my_tuple[:3] # インデックス0からインデックス2までを取得 print(slice2) # 'apple', 'banana', 'cherry'を出力 slice3 = my_tuple[2:] # インデックス2から最後までを取得 print(slice3) # 'cherry', 'date', 'elderberry'を出力
ご覧のように、指定した要素を別のタプルにコピーして新規作成するようなイメージです。
スライス操作には3つ目のパラメータ step
も追加できます。この step
はスライスする間のステップ数(取得する要素の間隔)を指定します。
my_tuple = ('apple', 'banana', 'cherry', 'date', 'elderberry') slice5 = my_tuple[::2] # タプル全体をスライスし、1つ飛ばしで要素を取得 print(slice5) # 'apple', 'cherry', 'elderberry'を出力
Pythonのスライス操作は非常に便利で、様々な場面で使われます。以下にその具体的な使用例をいくつか紹介します。
サンプル1 リストやタプルの部分集合を取得する
リストやタプルから部分的な要素を取り出すことが多々あります。例えば、ある範囲のデータだけを見たい場合や、データの一部だけを別の関数に渡したい場合などにスライス操作が役立ちます。
data = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) # 最初の5つの要素を取得 first_five = data[:5] print(first_five) # (1, 2, 3, 4, 5)を出力
サンプル2 要素をスキップする
リストやタプルから一定の間隔で要素を取り出したい場合もあります。例えば、各要素が毎日のデータで構成されていて、毎週のデータだけを見たい場合などです。
daily_data = ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') * 4 # 4週間分のデータ # 各週の月曜日のデータだけを取得 mondays = daily_data[::7] print(mondays) # ('Mon', 'Mon', 'Mon', 'Mon')を出力
サンプル3 文字列を反転する
文字列もスライス可能なシーケンスとして扱われます。文字列の逆順を得るには、ステップに -1
を指定します。
greeting = "Hello, World!" # 文字列を反転 reverse_greeting = greeting[::-1] print(reverse_greeting) # "!dlroW ,olleH"を出力

上記の例のように、スライス操作はデータ分析、文字列操作、コードの可読性向上など、様々なシナリオで非常に役立ちます。
Python:タプルの結合
Pythonでは、2つのタプルを結合(連結)して新しいタプルを作成することができます。これは+
演算子を使って行います。以下に具体的な例を示します。
# タプルの定義 tuple1 = ("apple", "banana", "cherry") tuple2 = ("orange", "melon", "kiwi") # タプルの結合 tuple3 = tuple1 + tuple2 print(tuple3) # ("apple", "banana", "cherry", "orange", "melon", "kiwi")を出力
参考 算術演算子
この例では、tuple1
とtuple2
を結合して、新しいタプルtuple3
を作成しています。

また、一つのタプルを複数回繰り返して結合することもできます。これは*
演算子を使って行います。
# タプルの定義 tuple1 = ("apple", "banana", "cherry") # タプルの複数回繰り返し tuple2 = tuple1 * 3 print(tuple2) # ("apple", "banana", "cherry", "apple", "banana", "cherry", "apple", "banana", "cherry")を出力
この例では、tuple1
を3回繰り返して、新しいタプルtuple2
を作成しています。
タプルの結合操作は、複数のデータセットを統合したり、同じパターンのデータを繰り返したりするときに非常に便利。ただし、大量のデータを結合する場合は、リストのような可変型を使用することが効率的であるという点を押さえておきましょう。
Python:タプルのパック・アンパック
Pythonでは、タプル(または他のシーケンス型)を作成する際に、値のグループを一つのタプルに「パック」することができます。逆に、タプルの各要素を複数の変数に「アンパック」することも可能です。

パック・アンパックというと難しいですが、簡単に言えばタプルは他の値を1つにまとめることもできるし、逆に分解することも可能ですよ!ということです。
パック(Packing)
タプルのパッキングは、複数の値を一つのタプルに「パック」することを意味します。例えば、以下のように複数の値をコンマで区切って一つのタプルを作ることができます。
fruits = 'apple', 'banana', 'cherry' print(fruits) # ('apple', 'banana', 'cherry')を出力
この場合、'apple'
、'banana'
、'cherry'
という3つの値が一つのタプルにパックされます。
アンパック(Unpacking)
逆に、タプルのアンパッキングは、一つのタプルを複数の変数に「アンパック」することを意味します。例えば、以下のように一つのタプルから各要素を取り出して複数の変数に代入することができます。
fruits = ('apple', 'banana', 'cherry') fruit1, fruit2, fruit3 = fruits print(fruit1) # 'apple'を出力 print(fruit2) # 'banana'を出力 print(fruit3) # 'cherry'を出力
この場合、fruits
という一つのタプルがfruit1
、fruit2
、fruit3
という3つの変数にアンパックされます。
参考 Pythonの変数の基本

タプルのパッキングとアンパッキングは、複数の値を一緒に扱ったり、関数から複数の値を返したりする際に非常に便利です。
Python:タプル(tuple)のまとめ

始めてPythonを勉強するのは結構難しいですよね。
でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。
Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!
読者料典 Python入門:学習カリキュラム ←こちらから!