はじめに
第7回目の今回は、タプルという概念について解説したいと思います。
タプルは、前回学んだリストと同様に、複数のデータをまとめて扱うためのデータ型です。今回の記事では、タプルの基本的な特徴や作り方、そしてリストとの違いを理解していきます。タプルをしっかりと学ぶことで、Pythonのデータ管理がより効率的になります。
タプルとは何か
タプルは、リストと非常によく似たデータ型です。リストでは、たくさんの「箱」をまとめて管理することができましたが、タプルも同じように複数のデータを一つにまとめることができます。
このような箱のことを「要素」と呼び、それぞれの要素には「インデックス」という番号が割り振られています。この番号は0から始まり、タプル内のデータの位置を示します。
リストとタプルはとても似ていますが、大きな違いがあります。それは、タプルは「不変」であることです。
不変というのは、タプルに新しい要素を追加したり、要素を変更したり、削除することができない*ということです。つまり、一度作ったタプルの中身は変えることができません。
この特徴がリストとは異なるポイントです。リストは自由に追加・削除ができるため柔軟に使えますが、タプルはデータを変えたくないときや、何かを固定したいときに使います。この不変な性質により、タプルは安全性が高く、データの取り扱いがしやすくなる場合もあります。
タプルの作り方
タプルは簡単に作成することができます。作り方の決まりは「丸括弧を使い、それぞれの要素をカンマで区切る」ということです。それでは、具体的な例を使ってタプルの作り方を見てみましょう。
タプルの基本的な作り方
# タプルを作成する
# a という名前の変数にタプルを代入しています
# 丸括弧を使って、それぞれの要素をカンマで区切ります
a = ("りんご", "バナナ", "オレンジ")
# 作成したタプルを表示する
print(a) # 出力結果: ("りんご", "バナナ", "オレンジ")
上のコードでは、「りんご」「バナナ」「オレンジ」の3つのデータを持つタプルを作成しました。このようにタプルは、複数のデータをまとめるときにとても便利です。
空のタプルを作る
タプルには何も要素がない場合もあります。このようなタプルを「空のタプル」と呼びます。
# 空のタプルを作成する
empty_tuple = ()
# 空のタプルを表示する
print(empty_tuple) # 出力結果: ()
複数のデータ型を持つタプル
タプルの中には異なる種類のデータを入れることもできます。例えば、文字列、数値、ブール値(True/False)など、異なる型のデータをまとめることができます。
# 複数のデータ型を持つタプルを作成する
mixed_tuple = ("りんご", 3, True)
# 作成したタプルを表示する
print(mixed_tuple) # 出力結果: ("りんご", 3, True)
このように、タプルは異なる種類のデータをまとめることができるので、複数の情報を一度にまとめて管理することができます。
タプルの特徴
- タプルの要素を変更することはできません。一度作ったタプルの中のデータを後から変えることができないという特徴があります。
- 丸括弧を使って作成し、要素はカンマで区切ります。
- 空のタプルも作ることができます。
タプルの要素へのアクセス方法
作成したタプルの中にある個々の要素にアクセスするには、インデックスという番号を使います。このインデックスはタプル内の各要素の順番を示すもので、0から始まります。つまり、最初の要素にはインデックス0が割り振られています。
タプルの要素にアクセスするためには、変数名の後に角括弧([]
)を使ってインデックス番号を指定します。実際の例を見てみましょう。
# タプルを作成します
fruits = ("りんご", "バナナ", "オレンジ")
# タプルの各要素にアクセスします
# インデックス0にアクセス(最初の要素)
print(fruits[0]) # 出力結果: りんご
# インデックス1にアクセス(2番目の要素)
print(fruits[1]) # 出力結果: バナナ
# インデックス2にアクセス(3番目の要素)
print(fruits[2]) # 出力結果: オレンジ
タプルの中の要素にアクセスする際は、インデックス番号を使ってその要素を取得することができます。上記の例では、fruits[0]で「りんご」、fruits[1]で「バナナ」、fruits[2]で「オレンジ」を取得しています。
ここで注意してほしいのは、インデックス番号は0から始まるという点です。つまり、最初の要素にはインデックス0が、2番目の要素にはインデックス1が割り振られます。多くのプログラミング言語ではインデックスが0から始まるため、この点に注意が必要です。
また、タプルの要素数より大きなインデックス番号を指定するとエラーが発生します。以下はその例です。
# タプルを作成します
fruits = ("りんご", "バナナ", "オレンジ")
# 存在しないインデックスにアクセスするとエラーになります
print(fruits[3])
このように、タプルの要素にアクセスするときは、タプル内の要素数を確認し、存在しないインデックスを指定しないように注意しましょう。
また、インデックスには負の値も使うことができます。負のインデックスを使うと、タプルの最後の要素から数えた位置にアクセスできます。
# タプルを作成します
fruits = ("りんご", "バナナ", "オレンジ")
# 負のインデックスを使って要素にアクセスします
print(fruits[-1]) # 出力結果: オレンジ(最後の要素)
print(fruits[-2]) # 出力結果: バナナ(後ろから2番目の要素)
print(fruits[-3]) # 出力結果: りんご(後ろから3番目の要素)
負のインデックスを使うことで、タプルの最後の要素に簡単にアクセスできます。例えば、-1
はタプルの最後の要素を示します。
以上のように、タプルの要素にアクセスするためにはインデックスを使い、正の値でも負の値でも要素を取得することができます。
タプルの不変性について
タプルには「不変性」という重要な特徴があります。これは、一度作成したタプルの中身を変更することができないという性質を指します。つまり、タプルの要素を追加したり、変更したり、削除することはできません。この点がリストとの大きな違いです。
以下に、リストとタプルで要素を変更する例を比較してみましょう。
リストの要素変更
まず、リストの例です。リストでは、インデックスを指定して要素を変更することができます。
# リストを作成
fruits_list = ["りんご", "バナナ", "オレンジ"]
# リストの2番目の要素(バナナ)を変更します
fruits_list[1] = "ぶどう"
# 変更されたリストを表示
print(fruits_list) # 出力結果: ["りんご", "ぶどう", "オレンジ"]
上記のコードでは、リストの2番目の要素を「バナナ」から「ぶどう」に変更しました。このように、リストでは自由に要素を変更することが可能です。
タプルの要素変更(エラー例)
一方で、タプルの場合、同じように要素を変更しようとするとエラーになります。
# タプルを作成
fruits_tuple = ("りんご", "バナナ", "オレンジ")
# タプルの2番目の要素を変更しようとします
fruits_tuple[1] = "ぶどう" # エラーが発生します
上記のコードを実行すると、以下のようなエラーメッセージが表示されます。
TypeError: 'tuple' object does not support item assignment
このエラーメッセージは、「タプルは要素の変更をサポートしていない」という意味です。タプルは作成した後で中身を変更することができないため、このようなエラーが発生します。
タプルのスライス
タプルの中から、特定の範囲の要素を取得する方法を「スライス」と呼びます。スライスを使うことで、タプルから一部分の要素を取り出すことができます。この操作は、リストの時と同じように角括弧 []
とコロン :
を使って行います。
スライスでは、開始位置と終了位置のインデックスを指定します。ここでの注意点として、終了位置は含まれないということがあります。具体的な例を見てみましょう。
# タプルを作成
numbers = (0, 1, 2, 3, 4, 5)
# インデックス1から4までの要素を取得(終了位置は含まれない)
subset = numbers[1:4]
# スライスした結果を表示
print(subset) # 出力結果: (1, 2, 3)
上の例では、インデックス1からインデックス4の直前までの要素が取り出されています。この場合、インデックス1は「1」、インデックス2は「2」、インデックス3は「3」に対応しており、インデックス4の要素は含まれないため結果には含まれません。
また、スライスを使うときに開始位置や終了位置を省略することもできます。
# 開始位置を省略(最初から取得)
subset_start = numbers[:3]
print(subset_start) # 出力結果: (0, 1, 2)
# 終了位置を省略(最後まで取得)
subset_end = numbers[2:]
print(subset_end) # 出力結果: (2, 3, 4, 5)
# 開始位置と終了位置の両方を省略(全体を取得)
subset_all = numbers[:]
print(subset_all) # 出力結果: (0, 1, 2, 3, 4, 5)
スライスではステップ(どれくらいの間隔で要素を取得するか)を指定することもできます。ステップは開始位置、終了位置の後にもう1つコロンを付けて指定します。
# ステップを指定して要素を取得(2つおきに取得)
subset_step = numbers[0:6:2]
print(subset_step) # 出力結果: (0, 2, 4)
上の例では、0:6:2 という指定をしています。これは、インデックス0からインデックス6の直前までの要素を2つおきに取得するという意味です。
さらに、負のインデックスを使うことによってタプルの後ろから要素を取得することも可能です。
# インデックス -3 からタプルの終わりまで取得
subset_negative = numbers[-3:]
print(subset_negative) # 出力結果: (3, 4, 5)
この例では、インデックス-3
から最後までの要素を取得しています。負のインデックスを使うことで、後ろから数えて要素を取得することができます。
スライスを使うことで、タプルの中から必要な部分だけを取り出したり、特定の範囲を効率的に操作することが可能です。スライスはリストでも同様に使えるため、タプルとリストの両方に共通する便利な機能です。
タプルのネスト
タプルは、タプルの中にさらにタプルを入れることもできます。これを「ネストされたタプル」と言います。タプルのネストを使うことで、データを階層構造で整理することができ、複雑な情報をシンプルに管理するのに役立ちます。
ネストされたタプルの作り方
タプルの中に別のタプルを入れて作ることができます。以下は、ネストされたタプルの例です。
# ネストされたタプルを作成します
nested_tuple = (("りんご", "バナナ"), ("オレンジ", "ぶどう"))
# 作成したタプルを表示します
print(nested_tuple) # 出力結果: (("りんご", "バナナ"), ("オレンジ", "ぶどう"))
この例では、タプルの中に2つのタプルが入っています。それぞれのタプルには2つの要素があり、全体で階層的な構造になっています。
ネストされたタプルの要素へのアクセス
ネストされたタプルの要素にアクセスするには、インデックスを2回使用します。最初のインデックスで外側のタプルを指定し、次のインデックスでその中のタプルの要素を指定します。
# ネストされたタプルを作成します
nested_tuple = (("りんご", "バナナ"), ("オレンジ", "ぶどう"))
# 「りんご」にアクセスする(外側のタプルの0番目、内側のタプルの0番目)
print(nested_tuple[0][0]) # 出力結果: りんご
# 「ぶどう」にアクセスする(外側のタプルの1番目、内側のタプルの1番目)
print(nested_tuple[1][1]) # 出力結果: ぶどう
このように、ネストされたタプルの要素にアクセスする際は、まず外側のタプルから目的の内側のタプルを選び、その後内側のタプルの要素を選びます。上の例では、nested_tuple[0][0]で「りんご」、nested_tuple[1][1]で「ぶどう」にアクセスしています。
ネストされたタプルの特徴
ネストされたタプルを使用することで、関連するデータをまとめて保持し、階層的に整理することが可能になります。
例えば、複数の果物をグループ別に整理したり、住所の情報(市町村、県、国)など、まとまりのあるデータを階層ごとに分けて管理したりする際に役立ちます。
タプルが不変であるという性質は、ネストされたタプルにも適用されます。ネストされたタプルの中の要素も直接変更することはできません。
タプルの足し算・掛け算
タプルは、数値のように足し算や掛け算をすることができます。タプル同士を足し合わせたり、同じタプルの要素を繰り返したりすることで、データの操作を簡単に行うことができます。
タプルの足し算
タプルの足し算を行うと、2つのタプルを結合して新しいタプルを作成することができます。以下にタプルの足し算の例を示します。
# 2つのタプルを作成します
fruits1 = ("りんご", "バナナ")
fruits2 = ("オレンジ", "ぶどう")
# タプルを足し算して新しいタプルを作成します
combined_fruits = fruits1 + fruits2
# 結合したタプルを表示します
print(combined_fruits) # 出力結果: ("りんご", "バナナ", "オレンジ", "ぶどう")
この例では、fruits1 と fruits2 を +
演算子を使って結合しています。この操作により、4つの要素を持つ新しいタプルcombined_fruits が作られます。元のタプルfruits1 と fruits2 の内容は変更されません。
タプルの掛け算
タプルの掛け算を行うと、同じタプルの要素を繰り返し使った新しいタプルを作成することができます。以下にタプルの掛け算の例を示します。
# タプルを作成します
fruits = ("りんご", "バナナ")
# タプルを2回繰り返す
repeated_fruits = fruits * 2
# 繰り返したタプルを表示します
print(repeated_fruits) # 出力結果: ("りんご", "バナナ", "りんご", "バナナ")
この例では、タプルfruits を *
演算子を使って2回繰り返しています。その結果、新しいタプルrepeated_fruits には、元のタプルの内容が2回繰り返されて含まれています。
足し算と掛け算の特徴
タプルの足し算や掛け算を行っても元のタプルは変更されません。これにより、元のデータをそのまま保持しながら、新しいタプルを作りたい場合に便利です。また、タプルの結合や繰り返しによって、データを整理し直すことが簡単にできます。
タプルのメソッド
タプルには、リストのようにたくさんのメソッドはありませんが、基本的な操作を行うための、count() メソッドと index() という2つのメソッドが用意されています。
index() メソッド
index() メソッドは、指定した要素がタプルの中で最初に出現する位置を調べるメソッドです。具体的な使用例を見てみましょう。
# タプルを作成します
fruits = ("りんご", "バナナ", "オレンジ", "バナナ")
# バナナのインデックスを取得します
index_of_banana = fruits.index("バナナ")
# インデックスを表示します
print(index_of_banana) # 出力結果: 1
この例では、タプルfruits の中に「バナナ」が最初に登場する位置(インデックス)を調べています。index()
メソッドを使うと「バナナ」が最初に見つかったインデックス1
が返されます。
もし、タプル内に指定した要素が存在しない場合はエラーになりますので、注意が必要です。
count() メソッド
count() メソッドは、タプルの中で指定した要素が何回出現するかを数えるメソッドです。
# タプルを作成します
fruits = ("りんご", "バナナ", "オレンジ", "バナナ")
# タプルの中に「バナナ」が何回あるか数えます
count_of_banana = fruits.count("バナナ")
# 出現回数を表示します
print(count_of_banana) # 出力結果: 2
上の例では、タプルfruits の中に「バナナ」が何回登場するかを調べています。count() メソッドを使うと、「バナナ」が2回出現することがわかります。
メソッドを使う場面
これらのメソッドは、タプルの中から特定の要素の位置を調べたり、出現回数を確認したいときに使います。特に、データが固定されていて変更されない場合に、どのようにデータが配置されているかを調べるのに便利です。
タプルと組み込み関数
タプルはPythonの組み込み関数を使って操作することもできます。
組み込み関数とは
組み込み関数とは、Pythonに最初から用意されている便利な関数のことで、タプルのデータを確認したり操作するために使うことができます。このセクションでは、代表的な組み込み関数を使ったタプルの操作について説明します。
len() 関数
len() 関数は、タプルの中にいくつの要素があるかを調べるための関数です。
# タプルを作成します
fruits = ("りんご", "バナナ", "オレンジ")
# タプルの要素数を取得します
length_of_fruits = len(fruits)
# 要素数を表示します
print(length_of_fruits) # 出力結果: 3
この例では、タプルfruits の要素数をlen() 関数で取得し、その結果 3
を表示しています。
max() と min() 関数
max() 関数と min() 関数を使うと、タプルの中で最大値や最小値を取得することができます。数値を扱うタプルなどに便利な関数です。
# 数値のタプルを作成します
numbers = (5, 1, 8, 3)
# タプルの最大値を取得します
max_value = max(numbers)
# タプルの最小値を取得します
min_value = min(numbers)
# 最大値と最小値を表示します
print(max_value) # 出力結果: 8
print(min_value) # 出力結果: 1
この例では、タプルnumbers の最大値と最小値をそれぞれ取得し、それを表示しています。max() 関数で 8
、min() 関数で 1
が返されます。
in 演算子
in演算子は、指定した要素がタプルの中に存在するかどうかを確認するために使います。この操作は「含まれているかどうか」を判断するのにとても便利です。
# タプルを作成します
fruits = ("りんご", "バナナ", "オレンジ")
# タプルに「バナナ」が含まれているか確認します
is_banana_in_fruits = "バナナ" in fruits
# 結果を表示します
print(is_banana_in_fruits) # 出力結果: True
# タプルに「ぶどう」が含まれているか確認します
is_grape_in_fruits = "ぶどう" in fruits
# 結果を表示します
print(is_grape_in_fruits) # 出力結果: False
この例では、タプルfruits に「バナナ」が含まれているかどうかを確認し、True
が返されます。「ぶどう」は含まれていないため、False
が返されます。
sorted() 関数
sorted() 関数を使うと、タプルの要素を並び替えることができます。ただし、sorted() 関数の結果はリストとして返されるため、タプル自体は変更されません。
# 数値のタプルを作成します
numbers = (5, 1, 8, 3)
# タプルの要素を昇順に並び替えます
sorted_numbers = sorted(numbers)
# 並び替えた結果を表示します
print(sorted_numbers) # 出力結果: [1, 3, 5, 8]
この例では、sorted() 関数を使ってタプルnumbers の要素を昇順に並び替えています。結果はリストとして返されるため、元のタプルの内容は変更されません。
これらの組み込み関数を使うことで、タプルをさまざまな方法で操作し、必要な情報を取得することが可能です。タプル自体は不変ですが、組み込み関数を使うことで情報の確認や操作を柔軟に行うことができます。
タプルへの変換方法
Pythonでは、他のデータ型(例えばリストや文字列など)をタプルに変換することができます。タプルに変換することで、そのデータを変更できないように固定したい場合に便利です。
tuple() 関数でリストをタプルに変換する
リストは簡単にタプルに変換することができます。tuple() 関数を使うことで、リストの内容をタプルに変換します。以下にリストからタプルへの変換の例を示します。
# リストを作成します
fruits_list = ["りんご", "バナナ", "オレンジ"]
# リストをタプルに変換します
fruits_tuple = tuple(fruits_list)
# 変換したタプルを表示します
print(fruits_tuple) # 出力結果: ("りんご", "バナナ", "オレンジ")
この例では、リストfruits_list を tuple() 関数でタプルに変換しています。変換後のタプルは、リストと同じ要素を持ちながらも不変となります。
文字列をタプルに変換する
文字列もタプルに変換することが可能です。文字列をタプルに変換すると、文字列の各文字がタプルの要素になります。
# 文字列を作成します
text = "Python"
# 文字列をタプルに変換します
text_tuple = tuple(text)
# 変換したタプルを表示します
print(text_tuple) # 出力結果: ('P', 'y', 't', 'h', 'o', 'n')
この例では、文字列 text を tuple() 関数でタプルに変換しています。変換後のタプルには文字列の各文字がそれぞれ要素として入っています。
タプルへの変換が有用な理由
タプルへの変換は、データの不変性を確保したいときに特に有用です。例えば、プログラムの中で変更されてはいけない設定値や、動かしてはいけないデータを扱う際に、タプルに変換しておくことで、そのデータが誤って変更されることを防ぐことができます。
まとめ
タプルはリストと似ており、複数のデータをまとめて扱うことができるデータ型です。ただし、タプルの大きな特徴は不変性にあり、一度作成した後は変更することができません。この性質により、データの安全性が高まるため、変更を防ぎたいデータの管理に有用です。
タプルの作成方法や要素へのアクセス、メソッド、組み込み関数を使った操作について学ぶことで、Pythonでのデータ管理がさらに効率的になります。リストとタプルの違いを理解し、使い分けることで、データ処理を適切に行えるようになるでしょう。
次回は辞書型について解説予定です。
今回は以上となります。最後までお読みいただきありがとうございました。
MQL5システムトレーダーの為のPython講座:第6回「リストについて」←
→MQL5システムトレーダーの為のPython講座:第8回「辞書型について」
。