タプルの基本:変更できないリスト#
はじめに#
これまでに、Pythonのリストについて学んできました。リストは複数の要素をまとめて扱うことができる便利なデータ構造でした。今回は、リストとよく似た「タプル」というデータ構造について学びます。タプルはリストと似ていますが、一度作成すると変更できないという大きな特徴があります。
タプルとは#
タプルは、複数のデータをひとまとめにして扱うためのデータ構造です。リストとよく似ていますが、次のような違いがあります。
- タプルは 丸括弧 () で囲みます(リストは角括弧 でした)
- タプルは一度作ると、内容を変更できません
この「変更できない」という性質のことをプログラミングの世界では「イミュータブル」といいます。つまり、タプルは「イミュータブルなリスト」と考えることができます。
以下に、タプルの基本的な例を示します。
# タプルの作成
fruits = ("りんご", "バナナ", "オレンジ")
# タプルの内容を表示
print(fruits)
print(type(fruits)) # データ型を確認
('りんご', 'バナナ', 'オレンジ')
<class 'tuple'>
type()
関数を使うと、そのデータの型がわかります。
タプルの要素を取得する#
タプルの要素を取得するには、リストと同じようにインデックスを使います。
colors = ("赤", "青", "緑", "黄", "紫")
# インデックスを使って要素を取得
print("最初の色:", colors[0])
print("3番目の色:", colors[2])
print("最後の色:", colors[-1]) # 負のインデックスも使えます
最初の色: 赤
3番目の色: 緑
最後の色: 紫
タプルの要素は変更できない#
先ほど説明した通り、タプルの最大の特徴は一度作ると内容を変更できないことです。以下の例を見てみましょう。
# 以下のコードはエラーになります
# numbers = (10, 20, 30, 40, 50)
# numbers[0] = 15 # TypeError: 'tuple' object does not support item assignment
もし実際に numbers[0] = 15
というコードを実行しようとすると、「'tuple' オブジェクトはアイテムの代入をサポートしていません」というエラーが発生します。これが、タプルが「イミュータブル(変更不可)」と呼ばれる理由です。
タプルとリストの共通点#
タプルはリストと似ているため、いくつかの共通点があります。以下にいくつかの例を示します。
タプルの長さを調べる#
タプルの長さ(要素の数)を調べるには、リストと同様に len()
関数を使います。
cities = ("東京", "大阪", "名古屋", "福岡", "札幌")
print("都市の数:", len(cities))
都市の数: 5
タプルの結合#
タプルは変更できませんが、2つのタプルを結合して新しいタプルを作ることはできます。
tuple1 = (1, 2, 3)
tuple2 = (4, 5, 6)
# タプルの結合
combined_tuple = tuple1 + tuple2
print("結合されたタプル:", combined_tuple)
結合されたタプル: (1, 2, 3, 4, 5, 6)
タプルの要素の存在確認#
タプルの中に特定の要素が含まれているかを調べるには、in
演算子が使えます。
fruits = ("りんご", "バナナ", "オレンジ", "ぶどう")
# 要素の存在確認
print("バナナ" in fruits) # Trueが返る
print("メロン" in fruits) # Falseが返る
# 条件分岐と組み合わせる
fruit_to_check = "オレンジ"
if fruit_to_check in fruits:
print(f"{fruit_to_check}はタプルに含まれています")
else:
print(f"{fruit_to_check}はタプルに含まれていません")
True
False
オレンジはタプルに含まれています
タプルのスライス#
タプルからスライスして一部を取得することもできます。
numbers = (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
# スライスを使って部分タプルを取得
slice1 = numbers[2:5] # インデックス2から4までの要素
slice2 = numbers[:3] # 最初から3つの要素
slice3 = numbers[7:] # インデックス7から最後までの要素
print("元のタプル:", numbers)
print("スライス1 [2:5]:", slice1)
print("スライス2 [:3]:", slice2)
print("スライス3 [7:]:", slice3)
元のタプル: (0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
スライス1 [2:5]: (2, 3, 4)
スライス2 [:3]: (0, 1, 2)
スライス3 [7:]: (7, 8, 9)
タプルのアンパック(展開)#
タプルの強力な機能の一つに「アンパック」があります。これは、タプルの各要素を別々の変数に代入することができる機能です。
# 3つの要素を持つタプル
person = ("田中", 25, "エンジニア")
# タプルのアンパック
name, age, occupation = person
print("名前:", name)
print("年齢:", age)
print("職業:", occupation)
名前: 田中
年齢: 25
職業: エンジニア
このようにタプルをアンパックすると、それぞれの要素を個別の変数に代入できます。この機能は、複数の値を一度に扱いたい場合に非常に便利です。
リストとタプルの変換#
リストとタプルはお互いに変換することができます。
# リストからタプルへの変換
my_list = [1, 2, 3, 4, 5]
my_tuple = tuple(my_list)
print("リストからタプルへ:", my_tuple)
# タプルからリストへの変換
back_to_list = list(my_tuple)
print("タプルからリストへ:", back_to_list)
リストからタプルへ: (1, 2, 3, 4, 5)
タプルからリストへ: [1, 2, 3, 4, 5]
タプル作成の短縮形#
実は、タプルを作成する際に丸括弧を省略することもできます。
# 丸括弧ありのタプル
tuple1 = (1, 2, 3)
# 丸括弧なしのタプル(カンマが重要)
tuple2 = 1, 2, 3
print("丸括弧あり:", tuple1)
print("丸括弧なし:", tuple2)
print("同じタイプ?", type(tuple1) == type(tuple2))
丸括弧あり: (1, 2, 3)
丸括弧なし: (1, 2, 3)
同じタイプ? True
このように、カンマで区切られた値はタプルとして扱われます。特に、関数から複数の値を返す場合などによく使われます(関数については後の記事で説明します)。
要素が1つのタプル#
要素が1つだけのタプルを作る場合は注意が必要です。
# 要素が1つのタプル
single_item_tuple = (42,) # カンマが必要!
not_a_tuple = (42) # これはタプルではなく、整数42
print("タプル:", single_item_tuple, type(single_item_tuple))
print("タプルではない:", not_a_tuple, type(not_a_tuple))
タプル: (42,) <class 'tuple'>
タプルではない: 42 <class 'int'>
要素が1つだけのタプルを作成するには、値の後にカンマを付ける必要があります。カンマがないと、単なる括弧で囲まれた値として扱われます。つまり、この括弧は計算式や条件式の優先順位を示すのに使った括弧と同じ意味になってしまいます。
タプルの用途#
タプルはどのような場面で使われるのでしょうか?以下に主な用途を紹介します。
- 変更されてはいけないデータ:例えば、週の曜日や年の月など、決して変わらない定数のようなデータセット。
days_of_week = ("月曜日", "火曜日", "水曜日", "木曜日", "金曜日", "土曜日", "日曜日")
- 辞書のキー:後で学ぶ「辞書」というデータのキーには変更不可能なデータ型が必要で、タプルはその条件を満たします。
- 関数からの複数の戻り値:複数の値を返す関数に適しています。
- データを保護したい場合:データが誤って変更されないように保護したい場合に便利です。
リストとタプルの使い分け#
リストとタプルはどのように使い分けるべきでしょうか?
- リスト は、内容の変更が予想される場合に使います。例えば、ユーザーが入力するデータや、プログラムの実行中に追加・削除が必要なデータには、リストが適しています。
- タプル は、データが変更されないことがわかっている場合や、データを保護したい場合に使います。また、タプルはリストよりも少しだけ処理が速く、メモリ使用量も少ないという利点もあります。
まとめ#
今回はタプルについて学びました。タプルはリストに似ていますが、一度作成すると変更できないという大きな違いがあります。
- タプルは丸括弧
()
で定義し、要素はカンマで区切ります。 - タプルは一度作成すると要素を追加、削除、変更できません(イミュータブル)。
- タプルの要素へのアクセス方法や、スライスの方法はリストと同じです。
- タプルのアンパック機能を使うと、複数の変数に一度に値を代入できます。
- タプルはリストに比べて若干処理が速く、メモリ効率が良いです。
タプルの「変更できない」という性質は、一見すると制限のように思えるかもしれませんが、むしろこの性質がデータの安全性を保証し、プログラムのバグを減らすのに役立ちます。プログラミングでは、場面に応じて適切なデータ構造を選ぶことが重要です。