Pythonで複数のデータをまとめて扱う際、多くの人が最初に学ぶのが「リスト(list)」です。
しかし、Pythonにはリストと非常によく似た「タプル(tuple)」というデータ構造も存在します。
「どんな時にタプルを使えばいいの?」
この記事では、そんな疑問を抱えるPython初学者の方に向けて、タプルの基本的な特徴から、リストとの明確な違い、そしてタプルの具体的な活用シーンまで、サンプルコードを交えながら分かりやすく徹底解説していきます。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 550,000円(給付金適用あり) | |
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 | |
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ | |
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 無料 | |
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
Pythonのタプル(tuple)とは?
タプルとは、ひと言で言うと「変更不可能なリスト」です。
リストと同様に、複数の要素をカンマで区切って一つの変数に格納することができますが、その作成には[]
(角括弧)ではなく、()
(丸括弧)を使います。
そして、タプルの最も重要な特徴は、一度作成したら、その中の要素を追加したり、変更したり、削除したりすることが一切できないという点です。
この「変更不可」という性質が、リストとの最大の違いであり、タプルが存在する理由でもあります。
# これはリスト(変更可能)
my_list = [1, 2, 3]
# これがタプル(変更不可能)
my_tuple = (1, 2, 3)
プログラムの中で、意図せず書き換えられては困るような、固定的なデータの集まりを安全に管理したい場合に、タプルは非常に役立ちます。
タプルの基本的な使い方
それでは、タプルの具体的な作成方法や操作について見ていきましょう。
タプルの作成方法
タプルは()
で要素を囲んで作成します。
# 数値のタプル
tuple_a = (1, 2, 3, 4, 5)
print(tuple_a)
# 異なるデータ型を混在させることも可能
tuple_b = ('apple', 300, True)
print(tuple_b)
要素が1つのタプルを作成する際の注意点
要素が1つだけのタプルを作成する場合は、少し特殊な書き方が必要です。
# これはタプルではなく、ただの整数1
not_a_tuple = (1)
print(type(not_a_tuple))
# 要素が1つのタプルを作成するには、末尾にカンマが必要
is_a_tuple = (1,)
print(type(is_a_tuple))
実行結果
<class 'int'>
<class 'tuple'>
このように、要素が1つだけの場合は、値の後にカンマ(,
)を付けないと、Pythonはそれをタプルではなく、ただの数値や文字列として解釈してしまいます。
要素へのアクセス
タプル内の各要素へのアクセス方法は、リストと全く同じです。
インデックス番号を[]
で指定します。インデックスは0
から始まります。
colors = ('red', 'green', 'blue')
# 最初の要素にアクセス
print(colors[0]) # 'red'
# 最後の要素にアクセス
print(colors[-1]) # 'blue'
タプルのアンパッキング
タプルの便利な機能の一つに「アンパッキング」があります。
これは、タプルの各要素を、複数の変数に一度に代入する機能です。
# ユーザー情報をタプルで定義
user_info = ('Yamada', 30, 'Tokyo')
# アンパッキングして各変数に代入
name, age, city = user_info
print(f"名前: {name}")
print(f"年齢: {age}")
print(f"都市: {city}")
実行結果
名前: Yamada
年齢: 30
都市: Tokyo
このように、複数の値をまとめて扱いたい場合に非常にコードがすっきりとします。
タプルで利用できるメソッド
タプルは変更ができないため、リストのappend()
やremove()
のような要素を操作するメソッドは持っていません。
主に使えるのは、情報を取得するための以下の2つのメソッドです。
count(値)
: 引数に指定した値が、タプル内にいくつ含まれているかを数えます。index(値)
: 引数に指定した値が、最初に現れるインデックス番号を返します。
data = (10, 20, 30, 20, 40, 20)
print(f"20の数: {data.count(20)}") # 3
print(f"30のインデックス: {data.index(30)}") # 2
タプルとリストの主な違い
ここで、タプルとリストの本質的な違いを整理しておきましょう。
変更可能性(ミュータブル vs イミュータブル)
これが最も重要な違いです。
リストはミュータブル(変更可能)であり、タプルはイミュータブル(変更不可能)です。
# リストは要素の変更が可能
my_list = [1, 2, 3]
my_list[0] = 100
print(f"変更後のリスト: {my_list}") # [100, 2, 3]
# タプルは要素を変更しようとするとエラーになる
my_tuple = (1, 2, 3)
try:
my_tuple[0] = 100
except TypeError as e:
print(f"タプルの変更エラー: {e}")
実行結果
変更後のリスト: [100, 2, 3]
タプルの変更エラー: 'tuple' object does not support item assignment
タプルの要素を変更しようとすると、TypeError
が発生し、プログラムが停止します。
この性質により、タプルはプログラム内で誤ってデータが書き換えられるのを防ぎ、データの安全性を保証します。
パフォーマンス(速度とメモリ)
一般的に、タプルはリストに比べて若干ですが処理が高速で、メモリの消費量も少ない傾向にあります。
これは、タプルが変更されないことが保証されているため、Pythonが内部で最適化を行いやすいからです。
ただし、この差は非常に大規模なデータを扱わない限り体感できるほどではありません。
どちらを選ぶかの主な判断基準は、やはり「変更可能性」であるべきです。
用途
これらの違いから、おのずと用途も分かれてきます。
【リスト】
要素の追加・削除・変更が頻繁に発生する、動的なデータの集まりに適しています。
(例: ユーザーのToDoリスト、ショッピングカートの中身)
【タプル】
プログラムの実行中に変わることのない、固定的なデータの組に適しています。
(例: 関数の設定値、座標データ、定数)
タプルはいつ使うべきか?
では、具体的にどのような場面でタプルを選択するとよいのでしょうか。
定数として使う
プログラム内で変わることのない、一連の値を定義したい場合に最適です。
タプルにしておくことで、誤って値を変更してしまうミスを防げます。
# 曜日をタプルで定義(変更されるべきではない)
WEEKDAYS = ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')
# RGBカラーコードをタプルで定義
RED = (255, 0, 0)
GREEN = (0, 255, 0)
辞書のキーとして使う
Pythonの辞書(dict)のキーには、リストのような変更可能なオブジェクトは使えません。
しかし、変更不可能なタプルは辞書のキーとして利用できます。
# 緯度経度をキーとして、都市名を格納する辞書
locations = {
(35.6895, 139.6917): "Tokyo",
(40.7128, -74.0060): "New York"
}
print(locations[(35.6895, 139.6917)]) # "Tokyo"
関数の戻り値として使う
関数から複数の値を返したい場合、タプルは非常にエレガントな解決策となります。
関数は戻り値としてタプルを返し、呼び出し元はそれをアンパッキングして受け取ります。
def get_user_profile():
name = "Sato"
age = 45
return name, age # 自動的に (name, age) というタプルが返される
# アンパッキングで戻り値を受け取る
user_name, user_age = get_user_profile()
print(f"{user_name}さんは{user_age}才です。") # Satoさんは45才です。
これは、Pythonで非常によく使われるテクニックです。
まとめ
以上、Pythonのデータ構造「タプル」について、その特徴と使い方を詳しく解説しました。
なお、Pythonを体系的に学んだり、Pythonのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。