PR

【Python】タプル(tuple)とは?3分でわかりやすく解説

Python

Pythonのタプルとは、不変(変更不可)な順序付きの要素の集合のこと。

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

参考 リストとは?

このページではPython初心者向けにタプル(tuple)とは何か?どのように利用すればよいか?を3分でわかりやすくサンプルコード付きで解説します。

このページで学べる内容
  • Python:タプルとは?(リストとの相違点)
  • タプルの利用方法と注意点

Pythonエンジニアを目指す方であれば知らないと恥ずかしい超・基本知識の1つです。是非最後までご覧ください。

参考 Pythonの基本的な書き方・構文ルール

スポンサーリンク

Python:タプルとは?

Pythonのタプルとは、不変(変更不可)な順序付きの要素の集合のこと。

Python タプル
図1:Python タプルのイメージ

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

例えば、あなたが旅行に行くときにリュックサックに何か入れるとしましょう。このリュックサックはあなたのタプルだと考えてみてください。それぞれのアイテム(水筒、地図、カメラなど)はタプルの要素となります。一旦リュックサックがパックされ、旅行が始まったら、その中身は変えることができない(不変性)というのがタプルのイメージです。

リストとの相違点

リストは順序を持つ可変のデータ型です。つまり、一度定義した後で様々な変更を行うことが可能な点でタプルとは異なります。

fruits = ['apple', 'blueberry', 'cherry']
fruits.append('date')  # リストの末尾に新しい要素を追加します
print(fruits)  # ['apple', 'blueberry', 'cherry', 'date']が出力されます

参考 print関数

リストについて復習しておきたい方は以下の記事をご覧ください。

参考 Python:リストの基本

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、というようになります。

Python タプル
再掲:Python タプルのイメージ

タプルから特定の要素を取り出すには、その要素のインデックスを角括弧([])の中に書きます。

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")を出力

参考 算術演算子

この例では、tuple1tuple2を結合して、新しいタプル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という一つのタプルがfruit1fruit2fruit3という3つの変数にアンパックされます。

参考 Pythonの変数の基本

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

Python:タプル(tuple)のまとめ

Python:タプルのまとめ
  • タプルは不変型のシーケンスデータ型:タプルの要素は作成後に変更することができません。そのため、一度設定したデータを保持するのに適しています。
  • 複数のデータ型を持つことが可能:タプルの要素は異なるデータ型を持つことが可能です。例えば、整数、文字列、リストなどを一つのタプル内に混在させることができます。
  • 順序を保持:タプルは要素の順序を保持します。つまり、要素は追加された順番で格納され、一意のインデックスでアクセスすることができます。
  • パックとアンパック:複数の値を一つのタプルにまとめる(パック)ことができますし、一つのタプルの各要素を複数の変数に分解する(アンパック)ことも可能です。
  • 辞書のキーとして使用可能:不変性を持つため、タプルは辞書のキーとして使用することができます。
  • 単一要素のタプル:タプルに単一の要素だけを持たせたい場合、末尾にコンマを付ける必要があります。
  • 大量のデータを結合する際の注意点:タプルの結合は新しいタプルを作成するためのコストが発生します。そのため、大量のデータを結合する場合には、リストなどの可変型のデータ構造を使用することが効率的です。

タプルのアンパックを利用して、一時変数を使わずに2つの変数の値を入れ替える処理は以下の通り。

# 変数の初期値
x = "Hello"
y = "World"

print(f"Before swap: x = {x}, y = {y}")

# タプルを使用して変数の値をスワップ
x, y = y, x

print(f"After swap: x = {x}, y = {y}")

### 出力結果 ###
# Before swap: x = Hello, y = World
# After swap: x = World, y = Hello

始めてPythonを勉強するのは結構難しいですよね。

でもその悩みを抱えているのは一人じゃありません。全てのPython使いが同じ道を進んできました。

Pythonをはじめとするプログラミングスキルを武器に、時間と場所に捉われない自由な生き方を目指してみませんか?今すぐ行動したい方は以下の記事をチェック!

読者料典 Python入門:学習カリキュラム ←こちらから!

このWebサイトは現役のエンジニアが以下3点を目的として運営しています。

  1. 勉強:一度理解した内容を忘れないように。
    → アウトプットは「最強のインプット」である! 
  2. 備忘:忘れたとしても後から見返せるように。
    → 未来の自分への「お手紙」を書いています。 
  3. 共有:〇〇ってこうだったんだ!の感動をシェアできるように。
    → あなたの知識は誰かにとっての「価値ある情報」です。 

副業ブログの始め方はこちらから

スポンサーリンク
Python
シェアする
ビズドットオンラインをフォローする
blank
ビズドットオンライン
タイトルとURLをコピーしました