【Python】タプル(tuple)の使い方は?リストとの違いやアンパック、変換方法を徹底解説

【Python】タプル(tuple)の使い方は?リストとの違いやアンパック、変換方法を徹底解説

Amazonのアソシエイトとして、ITナレッジライフは適格販売により収入を得ています。

記事の文字数:2,534 / 総アクセス数:81 views

Pythonのタプル(tuple)の使い方を徹底解説。リストとの違いやイミュータブルな特性、アンパック(複数代入)の書き方、変換方法を分かりやすく解説します。辞書のキーとしての活用やNamedTupleなど、実務で役立つ使いどころも網羅。初心者必見の完全ガイドです。

Pythonを学び始めると、タプル(tuple)というデータ型に出会います。 「タプルって何?リストと何が違うの?」「タプルに要素を追加したいけどできない?」「どうやって取り出したり変換したりするの?」という疑問を持ったことがある方に向けて、この記事ではPythonタプルの追加・取り出し・変換について丁寧に解説します。

記事のポイント:

  • リストとの違い: タプルは一度作ると変更できない「イミュータブル」なデータ型。
  • 便利な機能: アンパック(複数代入)や関数の戻り値、辞書のキーとして活用できる。
  • 使い分け: 安全性を重視するデータや設定値にはタプルを選ぶのが正解。

Pythonタプルの基本的な使い方

Pythonにおけるタプル(tuple)は、複数の値を一つのデータ構造にまとめることができるイミュータブル(変更不可)なデータ型です。リスト(list)と似ていますが、タプルは一度作成すると要素の追加や変更ができません。ただし、要素にリストなどのミュータブルなオブジェクトを含む場合、その中身は変更可能です。

タプルの作成方法(複数)

タプルは ()(丸括弧)を使って作成できます。

tuple-multi-create01.py
# タプルの作成
fruits = ("apple", "banana", "cherry")
print(fruits) # ('apple', 'banana', 'cherry')

異なる型の要素を並べることもできます。

tuple-multi-create02.py
multi = (1, "Python", True)
print(multi) # (1, 'Python', True)

また、カンマ(,)区切りで要素を並べることで、丸括弧なしでもタプルを作成できます。

tuple-multi-create03.py
numbers = 1, 2, 3
print(numbers) # (1, 2, 3)

タプルの作成方法(単一)

単一の要素を持つタプルを作成する場合は、要素の後にカンマを付ける必要があります。

tuple-single-create01.py
single_tuple = ("apple",)
print(single_tuple) # ('apple',)

カンマを付けないと単なる文字列(または数値)として扱われます。

tuple-single-create02.py
not_a_tuple = ("apple")
print(type(not_a_tuple)) # <class 'str'>

インデックスでタプルの要素を取り出す

タプルの要素にはインデックスを指定してアクセスできます。

tuple-index.py
fruits = ("apple", "banana", "cherry")
print(fruits[0]) # apple
print(fruits[1]) # banana

スライスでタプルの要素を取り出す

スライスを使って部分的に取得することも可能です。

tuple-slice.py
numbers = (0, 1, 2, 3, 4, 5)
print(numbers[1:4]) # (1, 2, 3)

タプルの応用的な使い方

関数からタプルを受け取る

関数が複数の値を返す場合、タプルを使って簡単に分割代入できます。

tuple-func.py
def get_info():
return "Alice", 25, "Engineer"
name, age, job = get_info()
print(name) # Alice
print(age) # 25
print(job) # Engineer

タプルをforループで取り出す

タプルはforループで取り出すこともできます。

tuple-for.py
fruits = ("apple", "banana", "cherry")
for item in fruits:
print(item)

タプルの結合(+)と繰り返し(*)方法

タプル同士を + で結合したり、* で繰り返したりできます。

tuple-join.py
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
new_tuple = tuple1 + tuple2
print(new_tuple) # (1, 2, 3, 4, 5, 6)
repeated_tuple = tuple1 * 3
print(repeated_tuple) # (1, 2, 3, 1, 2, 3, 1, 2, 3)

タプルのアンパック(複数の変数に分割する)

タプルの要素を複数の変数に分割して代入することができます。

tuple-division01.py
tuple_data = (10, 20, 30)
a, b, c = tuple_data
print(a) # 10
print(b) # 20
print(c) # 30

また、* を使って残りの要素をリストとして格納することも可能です。

tuple-division02.py
tuple_data = (1, 2, 3, 4, 5)
a, *b, c = tuple_data
print(a) # 1
print(b) # [2, 3, 4]
print(c) # 5

タプルの分割代入を活用すると、変数の値を簡単に交換することもできます。

tuple-division03.py
a, b = 5, 10
a, b = b, a
print(a) # 10
print(b) # 5

タプルを辞書のキーとして使用する

タプルはイミュータブルなため、辞書のキーとして使用できます。

tuple-dict.py
locations = {
(35.6895, 139.6917): "Tokyo",
(40.7128, -74.0060): "New York"
}
print(locations[(35.6895, 139.6917)]) # Tokyo

なぜタプルを使うのか?メリットと使いどころ

「変更できないならリストだけで十分では?」と思うかもしれませんが、タプルには明確なメリットがあります。

  • 安全性の確保: プログラム内で変更されてはいけない定数や設定値を保護できます。

  • 処理速度の向上: タプルはリストよりもメモリ消費が少なく、不変(immutable)であるため内部構造がシンプルで、リストよりも構築やアクセスがわずかに高速になる傾向があります。ただし、純粋なイテレーション(繰り返し処理)の速度差は実測上ほぼ誤差範囲内であり、体感できるレベルの差はほとんどありません。

  • ハッシュ可能(Hashable): タプルはすべての要素がハッシュ可能な値で構成されている場合に限り「ハッシュ可能」になります(再帰的にチェックされます)。これにより、辞書のキーや集合(set)の要素として使用できます。なお、リストなどのミュータブルな値を要素に含むタプルはハッシュ不可能となるため、辞書のキーには使用できません。

    tuple-hash.py
    # ✅ ハッシュ可能なタプル(要素がすべて数値)
    locations = {(35.6895, 139.6917): "Tokyo"} # 問題なし
    # ❌ ハッシュ不可能なタプル(リストを含む)
    bad_tuple = (1, [2, 3])
    d = {bad_tuple: "error"} # TypeError: unhashable type: 'list'

実務では、関数の戻り値として複数の値を返したり、座標データや設定値をまとめたりする際によく使われます。

さらなる活用:NamedTuple(名前付きタプル)

中級者以上の方にぜひ知っておいてほしいのが、collections モジュールの namedtuple です。通常のタプルはインデックス [0] などで要素にアクセスしますが、NamedTuple を使うと属性名でアクセスできるようになります。

tuple-named.py
from collections import namedtuple
# Pointという名前のタプル型を定義
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x) # 10
print(p.y) # 20

コードの可読性が大幅に向上するため、複雑なデータを扱う際に非常に便利です。なお、Python 3.7以降では typing.NamedTupledataclasses もよく使われる選択肢です。

Pythonのタプルはイミュータブルなデータ構造

Pythonのデータ型は、大きく分けて イミュータブル(変更不可)ミュータブル(変更可能) に分類されます。

  • イミュータブル(Immutable): 一度作成されたら内容を変更できないデータ型。
    • 例: int, float, str, tuple
  • ミュータブル(Mutable): 内容を変更したり、要素を追加・削除できるデータ型。
    • 例: list, dict, set

イミュータブルの例(タプル)

タプルの大きな特徴は、要素の再代入(入れ替え)ができないことです。

tuple-immutable.py
fruits = ("apple", "banana", "cherry")
fruits[0] = "grape" # エラー発生

タプルはイミュータブルなので、作成後に要素の変更はできません。

ミュータブルの例(リスト)

list-mutable.py
fruits_list = ["apple", "banana", "cherry"]
fruits_list[0] = "grape" # 問題なく変更可能
print(fruits_list) # ['grape', 'banana', 'cherry']

リストはミュータブルなので、要素を自由に変更できます。

タプルの要素を一度リストに変換して変更する

タプルの要素を変更する必要がある場合は、タプルをリストに変換してから編集し、再びタプルに戻す方法があります。

tuple-change.py
fruits = ("apple", "banana", "cherry")
fruits_list = list(fruits) # リストに変換
fruits_list[0] = "grape"
fruits = tuple(fruits_list) # 再びタプルに変換
print(fruits) # ('grape', 'banana', 'cherry')

タプルとリストの違い

違いを表でまとめると下記の通りです。

項目タプルリスト
変更❌ 不可✅ 可
処理速度△ わずかに速い傾向△ わずかに遅い傾向
メモリ消費✅ 少ない❌ 多め
ハッシュ✅ 可能(Hashable)❌ 不可
使用例座標・定数の表現汎用的な配列操作
【Pythonリスト】追加・削除・結合・カウント方法まとめ
ITナレッジライフ

【Pythonリスト】追加・削除・結合・カウント方法まとめ

Pythonのリスト(list)について、追加や削除などの基本操作から応用的な使い方、スライスやメモリ効率の最適化まで詳しく解説します。要素の追加・削除・変更、リスト内包表記やタプルや辞書との違いを比較し、それぞれの特徴や活用方法を紹介します。

Pythonタプルまとめ

  • タプルはイミュータブルなデータ型で、一度作成すると変更できない。
  • インデックスやスライスで要素を取得できる。
  • +* を使って結合や繰り返しが可能。
  • * を使った分割代入が可能。
  • 変数のスワップや関数の戻り値の受け取りに便利。
  • 関数の戻り値や辞書のキーとして便利に使える。

Pythonでタプルを適切に使いこなすことで、より安全で効率的かつ意図が明確なコードを書くことができます。

参考リンク

Pythonユーザにお勧めの本

人気

スッキリわかるPython入門 第2版 スッキリわかるシリーズ

難易度
実用性
読みやすさ

対話形式でスラスラ読める。複雑な概念もキャラクターが分かりやすく解説してくれます。

独習Python

難易度
実用性
網羅性

言語仕様を深く解説。なんとなく書ける状態から、自信を持って書ける状態へ引き上げてくれます。

Python1年生 第2版 体験してわかる!会話でまなべる!プログラミングのしくみ

難易度
実用性
読みやすさ

イラスト中心で、プログラミングの楽しさを教えてくれる。ワクワクしながら学べる入門書です。


以上で本記事の解説を終わります。
よいITライフを!

Pythonユーザにお勧めの本

人気

スッキリわかるPython入門 第2版 スッキリわかるシリーズ

難易度
実用性
読みやすさ

対話形式でスラスラ読める。複雑な概念もキャラクターが分かりやすく解説してくれます。

人気記事


記事を評価

Thanks!
目次
Scroll to Top